[antlr-interest] Some bugs (or features?) in Honey Badger
Jan Finis
finis at in.tum.de
Mon Feb 20 04:41:57 PST 2012
On 02/19/2012 10:33 PM, Terence Parr wrote:
>
> Hi. this suprising me. It translates to:
>
> expr[int _p]
> : ( ID '=' expr[3]
> | ID
> )
> ( {1>= $_p}? '+' expr[2]
> )*
> ;
>
> (See -Xlog option). Pretty hard for that to match as a=(a+a). are you sure?
Hi Ter,
I tested it again and was able to confirm the precedence bug, here is an
example grammar producing the bug:
grammar TestGrammar;
start returns [String result]
: expr {$result = $expr.result; }
;
expr returns [String result]
: ID '=' e1=expr { $result = "(" + $ID.getText() + "=" +
$e1.result + ")"; }
| ID { $result = $ID.getText(); }
| e1=expr '+' e2=expr { $result = "(" + $e1.result + "+" +
$e2.result + ")"; }
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
This is the input:
a=a+a
The output is (a=(a+a)). With correct precedence the output should be
((a=a)+a).
I used the jar from
http://antlr.org/download/antlr-4.0ea-complete.jar
and redownloaded it to make sure that I do not have an outdated version.
The output was produced using this code:
TestGrammarLexer lex = new TestGrammarLexer(new ANTLRInputStream(new
FileInputStream(new File("test.input"))));
CommonTokenStream tokens = new CommonTokenStream(lex);
StartContext i = new TestGrammarParser(tokens).start();
System.out.println(i.result);
>
>> the precedence should be from top to bottom, right? So, the input a=a+a
>> should be parsed as (a=a)+a, since the assignment rule is on the top.
>> However, this is not the case, instead, it is parsed as a=(a+a). Bug, or
>> am I interpreting something wrong?
>>
>> 2. Name binding
>>
>> Consider this example:
>>
>> expr returns [int r]
>> : '-' expr { $r = - $expr.r; }
>>
>> In this example $expr should bind to the sub-expression in my opinion.
>> However, it does not. Since the rule is also named expr, $expr refers to
>> the rule context instead of the context of the sub-expression. I think
>> most of the time this is not what the user wants.
> I think this is consistent with v3. i'll add to list to think about. thanks!
> Ter
Yes, it is consistent with v3, however v3 didn't have these crazy left
recursive rules :).
With these rules, it is much more common to have a non-terminal of the
same type as the rule itself.
More information about the antlr-interest
mailing list