2010-04-09 13 views
1

J'ai une simple grammaire ANTLR, que j'ai dénudée à son strict minimum pour démontrer ce problème. J'utilise ANTLRworks 1.3.1.ANTLR jetons de non-concordance lexer

grammar sample; 

assignment : IDENT ':=' NUM ';' ; 

IDENT  : ('a'..'z')+ ; 

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

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

De toute évidence, cette déclaration est acceptée par la grammaire:

x := 99; 

Mais celui-ci est aussi:

x := @!$()()%99***; 

sortie de l'ANTLRworks Interprète:

ANTLR Interpreter diagram http://cs.sierracollege.edu/~barry/antlr-lexer.png

Qu'est-ce que je fais mal? Même d'autres exemples de grammaires fournies avec ANTLR (telles que la grammaire CMinus) présentent ce comportement.

+0

J'ai le msg err suivant à venir en exécutant « x: = @! $()()% 99 ***; " contre votre exemple: ligne 1: 5 aucune alternative viable au caractère '@' ligne 1: 6 aucune alternative viable au caractère '!' ... –

+0

Vous ne recevez pas ces messages? –

Répondre

2

Si vous regardez la console de votre IDE ANTLRWorks, vous verrez beaucoup d'erreurs lexer.

Essayez sur la ligne de commande:

grammar Sample; 

@members { 
    public static void main(String[] args) throws Exception { 
    ANTLRStringStream in = new ANTLRStringStream("x := @!$()()\%99***;"); 
    SampleLexer lexer = new SampleLexer(in); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    SampleParser parser = new SampleParser(tokens); 
    parser.assignment(); 
    } 
} 

assignment : IDENT ':=' NUM ';' ; 

IDENT  : ('a'..'z')+ ; 

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

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

puis:

// generate parser/lexer 
java -cp antlr-3.2.jar org.antlr.Tool Sample.g 

// compile 
javac -cp antlr-3.2.jar *.java 

// run Windows 
java -cp .;antlr-3.2.jar SampleParser 
// or run *nix/MacOS 
java -cp .:antlr-3.2.jar SampleParser 

produira:

line 1:5 no viable alternative at character '@' 
line 1:6 no viable alternative at character '!' 
line 1:7 no viable alternative at character '$' 
line 1:8 no viable alternative at character '(' 
line 1:9 no viable alternative at character ')' 
line 1:10 no viable alternative at character '(' 
line 1:11 no viable alternative at character ')' 
line 1:12 no viable alternative at character '%' 
line 1:15 no viable alternative at character '*' 
line 1:16 no viable alternative at character '*' 
line 1:17 no viable alternative at character '*' 
+0

Exactement !! C'est ce dont j'ai parlé dans le commentaire !! –

+0

@Wing, ANTLRWorks affiche également ces erreurs, mais dans un autre écran. –

+0

@Bart, oui. Merci pour votre info. Mais je ne comprends pas pourquoi Barry n'a pas pu voir les messages d'erreur antlr. Utilise-t-il une version différente d'antlr? –