2010-03-09 7 views
3

Je suis complètement nouveau pour les grammaires ANTLR et EBNF, donc c'est probablement un problème de base que je ne comprends tout simplement pas.ANTLR MismatchedTokenException sur une grammaire simple

J'ai une règle telle que:

version_line : WS? 'VERS' WS? '=' WS? '1.0' WS? EOL ; 
WS : ' '+ ; 
EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 

qui correspond à une déclaration dans mon fichier d'entrée qui ressemble à ceci (avec un espace en option):

Avec la forme de règle
VERSION = 1.0 

ci-dessus, je Je reçois une correspondance réussie, bien que j'obtienne une exception avec ce formulaire:

version_line : WS? 'VERS' WS? '=' WS? '1' '.0' WS? EOL ; 

ou ce formulaire:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.0' WS? EOL ; 
DIGIT : '1' ; 

Pourquoi est-ce différent? J'ai découvert ce problème en essayant de décomposer la règle encore plus, la fin nous l'espérons avec quelque chose comme ceci:

version_line : WS? 'VERS' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ; 
DIGIT : '0'..'9' ; 

Répondre

2

Je ne vois aucun problème, les quatre grammaires produisent le AST attendu:

version_line : WS? 'VERSION' WS? '=' WS? '1.0' WS? EOL ; 
WS : ' '+ ; 
EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 

alt text http://img130.imageshack.us/img130/2568/82912644.jpg

version_line : WS? 'VERSION' WS? '=' WS? '1' '.0' WS? EOL ; 
WS : ' '+ ; 
EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 

alt text http://img708.imageshack.us/img708/3493/51731096.jpg

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.0' WS? EOL ; 
DIGIT : '1' ; 
WS : ' '+ ; 
EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 

alt text http://img198.imageshack.us/img198/9674/94436521.jpg

version_line : WS? 'VERSION' WS? '=' WS? DIGIT '.' DIGIT WS? EOL ; 
DIGIT : '0'..'9' ; 
WS : ' '+ ; 
EOL : '\r' | '\n' | '\r\n' | '\n\r' ; 

alt text http://img198.imageshack.us/img198/7050/22348287.jpg

avec entrée:

VERSION = 1.0 
# 

(! Notez que le # dans l'entrée est une nouvelle ligne char)

testé avec ANTLRWorks v1.3.1.

+0

Hmm, vous avez raison. Cela doit être un problème avec les conflits ailleurs dans le fichier. Vous m'avez donné une bonne idée de la façon de le déboguer, (commencez à partir d'une règle et développez lentement). – jjkparker

+0

@jjkparker, oui, c'est comme ça que je le fais aussi: écrivez quelques règles, testez-le. Écrivez d'autres règles, testez-le, etc. –

Questions connexes