[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