2016-12-22 2 views
1

Je suis en train d'analyser la grammaire suivante, où Value peut être tout caractère jusqu'à la virgule, mais je ne peux pas le faire fonctionner correctement:Parse tout caractère jusqu'à ce point-virgule dans ANTLR4

grammar Test; 

pragmaDirective : 'pragma' Identifier Value ';' ; 

Identifier : [a-z]+ ; 

Value : ~';'* ; 

WS : [ \t\r\n\u000C]+ -> skip ; 

Quand je le tester avec pragma foo bar;, je reçois l'erreur suivante:

line 1:6 extraneous input ' ' expecting Identifier 
line 1:11 extraneous input 'bar' expecting ';' 

Répondre

0

Essayez ceci:

pragmaDirective : 'pragma' Identifier .*? ';' ; 

et supprimer la règle Value. Cela devrait faire le travail.

Et une recommandation: définir lexer règles pour vos littéraux (comme 'pragma') au lieu de les définir directement dans les règles de l'analyseur.

+0

J'ai fini par définir une nouvelle règle d'analyseur pour la valeur pragma. C'était ma première tentative d'écriture d'un analyseur avec ANTLR et j'aurais dû faire d'autres lectures. Merci pour la recommandation! –

0

la règle de valeur est beaucoup trop gourmand. Les règles Lexer tentent de correspondre autant que possible, donc pour une entrée comme celle-ci: pragma mu foo;, la règle Value correspond à pragma mu foo. Après tout, c'est zéro ou plusieurs caractères autres qu'un point-virgule.

Value n'est pas bien adapté pour être utilisé comme règle lexer. Je vous suggère de repenser votre approche. Peut-être créer une règle d'analyseur value qui correspond à un Identifier et peut-être d'autres règles lexer. Difficile de faire une suggestion sans voir grand-chose de la "vraie" grammaire (vous avez probablement posté une version simplifiée de la grammaire sur laquelle vous travaillez).