2010-06-19 6 views
1

J'ai essayé pendant quelques jours d'analyser du texte composé de texte et de nombres (je l'ai appelé une phrase dans ma grammaire).Analyser une entrée ambiguë avec Antlr

sentence options { 
      greedy=false; 
    } 
     : (ANY_WORD | INT)+; 

J'ai une règle qui a besoin d'analyser une phrase qui se termine par une INT

sentence_with_int 
     : sentence INT; 

Donc, si j'avais une entrée qui était « le nombre de la taille 14 chaussures achetées était 3 » sentence_with_int alors serait assorti non seulement une phrase. Je suis sûr qu'il y a une meilleure façon de le faire mais je suis en train d'apprendre l'outil.

Merci, Richard

Répondre

2

Votre grammaire:


grammar Test; 

sentence_with_int 
    : sentence {System.out.println("Parsed: sentence='"+$sentence.text+"'");} 
    INT  {System.out.println("Parsed: int='"+$INT.text+"'");} 
    ; 

sentence 
    : (ANY_WORD | INT)+ 
    ; 

ANY_WORD 
    : ('a'..'z' | 'A'..'Z')+ 
    ; 

INT 
    : ('0'..'9')+ 
    ; 

WS 
    : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} 
    ; 

fait exactement cela. Voici un petit harnais de test:

import org.antlr.runtime.*; 

public class Demo { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("the number of size 14 shoes bought was 3"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.sentence_with_int(); 
    } 
} 

d'abord générer un analyseur & lexer (en supposant que tous vos fichiers, et le pot de ANTLR, sont dans le même répertoire):

 
java -cp antlr-3.2.jar org.antlr.Tool Test.g 

et compiler tous les fichiers source .java :

 
javac -cp antlr-3.2.jar *.java 

et enfin lancer la classe Demo:

 
java -cp .:antlr-3.2.jar Demo 

(sous Windows, remplacez le : avec un ;)

qui produit la sortie suivante:

 
Parsed: sentence='the number of size 14 shoes bought was' 
Parsed: int='3' 
+0

Merci beaucoup Bart! –

+0

Pas de problème @Richard, même si je n'ai pas fait grand chose: votre grammaire était bonne pour commencer! :) –