[antlr-interest] Tree walker grammer help.

Gavin Lambert antlr at mirality.co.nz
Mon Sep 22 02:19:01 PDT 2008


At 19:43 22/09/2008, jack zhang wrote:
>If I use the TreeWalker version 1(see attached code),  test case 
>4 and 5 are not working.
>
>(4) a b c ==> a
>(5) a b AND c ==> a

That's because the WORD alternative will only match a single WORD 
and then stop, and you're only matching a single expression.

To match input like the above, you need to match multiple 
expressions.  That's as simple as adding this rule to your 
existing version 1 tree parser:

exprs : expr+ EOF;

After doing that, it ought to work perfectly.  (Well, after you 
modify it to produce the output you want.)

Alternatively, leave your grammar as is and call the expr() method 
multiple times.  Each call will get the next complete top-level 
expression from the input tree.

(Although you ought to remove "output=AST" from your tree 
grammars, since you're not actually generating AST output from 
them.)

>If I use the TreeWalker version 2(see attached code), test case 
>1,2,3 and 5 are not working.
[...]
>-Decision can match input such as "WORD" using multiple 
>alternatives: 1, 2
>As a result, alternative(s) 2 were disabled for that input-
[...]
>expr returns [String value=""]
>     : ^(AND a=expr b=expr) {
>         $value = "(" + $a.value + " and " + $b.value + ")";
>     }
>     | ^(OR a=expr b=expr) {
>         $value = "(" + $a.value + " or " + $b.value+ ")";
>     }
>     | ^(NOT a=expr) {
>         $value = "(not " + $a.value +")";
>     }
>     |  ( WORD {  $value +=  " " + $WORD.text;  })+  ;

It's the recursion that's doing you in here.  Follow through 
what's actually happening:

Case #1: input ^(AND a b):
   - enter rule expr
   - enter first alt (AND)
   - re-enter rule expr (for 'a')
   - enter last alt (WORD)
   - match WORD "a": value=" a"
   - match WORD "b": value=" a b"
   - exit rule expr; label a=" a b"
   - re-enter rule expr (for 'b')
   - no input left: fail

The other cases fail in a similar manner, if you follow them 
through.  (Note that this is the "greedy" interpretation of the 
parsing.  The non-greedy interpretation, which would have actually 
worked for this particular input, is the one ANTLR referred to as 
being disabled due to ambiguity.)

Just forget about parser #2 (although it would probably pay to 
look through it and work out why each of the test cases fail, now 
that you've got a hint).  The change mentioned above for parser #1 
should sort out your issue.



More information about the antlr-interest mailing list