tags:

views:

215

answers:

1

I'm completely new to ANTLR and EBNF grammars to begin with, so this is probably a basic issue I'm simply not understanding.

I have a rule such as:

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

that matches a statement in my input file that looks like this (with optional whitespace):

VERSION = 1.0

With the rule form above, I'm getting a successful match, although I get an exception with this form:

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

or this form:

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

Why is this different? I discovered this issue when trying to decompose the rule even more, hopefully ending up with something like this:

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

I see no problem, all four grammars produce the expected AST:

1

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

alt text

2

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

alt text

3

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

alt text

4

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

alt text

with input:

VERSION = 1.0
#

(Note that the # in the input is a new line char!)

Tested with ANTLRWorks v1.3.1.

Bart Kiers
Hmm, you're right. This must be a problem with conflicts elsewhere in the file. You gave me a good idea for how to debug it, though (start from one rule and slowly expand).
jjkparker
@jjkparker, yes, that's the way I do it as well: write some rules, test it. Write some more rules, test it, etc.
Bart Kiers