2010-05-01 5 views
0

Cet exemple ANTLR n'analyse pas l'entrée "1;" . Pouvez-vous expliquer pourquoi? Il analyse "11".Cet exemple antlr ne fonctionne pas correctement

grammar TestGrammar; 

options { 
    output=AST; 
} 

expr:  mexpr (PLUS^ mexpr)* SEMI!; 
mexpr:  atom (STAR^ atom)*; 
atom:  INT; 

LPAREN:  '('; 
RPAREN:  ')'; 
STAR:  '*'; 
PLUS:  '+'; 
SEMI:  ';'; 

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

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

Répondre

1

Pour la cible java, si vous changez: protégé DIGIT : '0' .. '9' ;

à fragment DIGIT : '0' .. '9' ;

cela fonctionnera.

J'espère que cela vous aide.

+0

Confirmé, modification protégée en fragment. – Pindatjuh

+2

J'ai compris. Explication: Le mot clé protégé fonctionne dans les versions antérieures d'ANTLR. Il ne fonctionne pas dans ANTLR 3. Maintenant, il faut utiliser fragment instread de protected. Protected est probablement ignoré dans ANTLR 3. Que se passe-t-il? ANTLR interprète INT et DIGIT comme un jeton. Comme ils sont très similaires, l'analyse échoue. En utilisant fragment, DIGIT n'est plus un jeton. Fragment dit que DIGIT fait partie d'une règle ou d'un autre jeton. Ensuite, l'exemple commence à fonctionner. – Aftershock

Questions connexes