[antlr-interest] For the documentation, perhaps
Josh Scholar
joshscholar at nightstudies.net
Thu Aug 9 01:01:39 PDT 2007
This wasn't exactly what I was expecting, so maybe it should be
documented ( I did buy the book by the way - but I probably skimmed
too much):
If you set a variable inside of an EBNF iterator but use it outside of
that iterator, it only gets the final value. Maybe attempting that
should be an error.
For instance, the following grammar, given "[a,b,c . d];" as input
returns (LIST A C (DOT D)) instead of (LIST A B C (DOT D)).
grammar simplelistgrammar;
options {
output=AST;
}
tokens {LIST;DOT;}
prog : statement *;
statement : atom? ';'! ;
#****the problem is $rest:
list :h='[' ( head=atom (',' rest=atom)* ('.' dot=atom)? )? ']'
->^(LIST $head? $rest* ^(DOT $dot)?) ;
atom :SYMBOL|list;
SYMBOL : ('a'..'z'|'A'..'Z')+;
WS : (' '|'\t')+ {$channel=HIDDEN;} ;
......
What works is
...
sublist : (','! atom)*;
list :h='[' ( head=atom rest=sublist ('.' dot=atom)? )? ']'
->^(LIST $head? $rest ^(DOT
$dot)?) ;
...
I wouldn't sure that second one would work even for something "[X.Y];"
where "sublist" is empty, but it does. The rewrite rules are smart
enough to avoid creating a link for an empty rule.
It might be complicated to make the parser understand some sort of
algebra of EBNF operators so that when you use a variable outside of
iterator it collects the values from the iteration into their
respective variables so that the original example just works.
Joshua Scholar
More information about the antlr-interest
mailing list