[antlr-interest] unary minus
Anders Hessellund
anders.hessellund at gmail.com
Sat Mar 7 03:47:31 PST 2009
Thanks,
but it doesn't work. Perhaps I should just turn backtracking and
memoisation on? It just seems to me that unary minus must be such a
common thing that there was a best practice for handling it.
-- AH
2009/3/6 Johannes Luber <JALuber at gmx.de>:
>> Hi,
>>
>> I've just turned to ANTLR and everything looks very nice. Except, I
>> have some problems with my implementation of unary minus. Can anyone
>> help me with the following errors?
>
> I think the problem is with the rules
>
> arithmeticExpr
> : sumExpr ( addSubOp^ sumExpr )*
> ;
>
> factorExpr
> : (MINUS^)? atom
> ;
>
> With the input "5 - 3" ANTLR doesn't know if it should match factorExpr with a MINUS or use addSubOp instead. Looking at my C# grammar, it uses the following (simplified) rule
>
> unary_expression
> : primary_expression
> | PLUS unary_expression
> | MINUS unary_expression
> ;
>
> Looking at primary_expression I'd say it is the equivalent of the atom rule. So try the following change:
>
> factorExpr
> : atom
> : MINUS^ factorExpr
> ;
>
> Johannes
>>
>> [16:11:03] error(211): McAntlrExpression.g:61:32: [fatal] rule
>> arithmeticExpr has non-LL(*) decision due to recursive rule
>> invocations reachable from alts 1,2. Resolve by left-factoring or
>> using syntactic predicates or using backtrack=true option.
>> [16:11:03] warning(200): McAntlrExpression.g:61:32: Decision can match
>> input such as "MINUS INTEGER" using multiple alternatives: 1, 2
>> As a result, alternative(s) 2 were disabled for that input
>>
>> Here is my grammar:
>>
>> grammar McAntlrExpression;
>> options {
>> output=AST;
>> ASTLabelType=CommonTree;
>> // backtrack=true;
>> // memoize=true;
>> }
>> prog: ( orExpr { System.out.println($orExpr.tree.toStringTree()); } )+
>> ;
>>
>> orExpr
>> : andExpr ( OR^ andExpr )*
>> ;
>>
>> andExpr
>> : equalityExpr ( AND^ equalityExpr )*
>> ;
>>
>> equalityExpr
>> : notExpr ( equalityOp notExpr )*
>> ;
>>
>> notExpr
>> : NOT^ boolExpr
>> | boolExpr
>> ;
>>
>> boolExpr
>> : BOOLEAN
>> | relationalExpr
>> ;
>>
>> relationalExpr
>> : arithmeticExpr ( relationalOp^ | equalityOp^ arithmeticExpr )
>> ;
>>
>> arithmeticExpr
>> : sumExpr ( addSubOp^ sumExpr )*
>> ;
>>
>> sumExpr
>> : factorExpr ( mulDivOp^ factorExpr )*
>> ;
>>
>> factorExpr
>> : (MINUS^)? atom
>> ;
>>
>> relationalOp
>> : LT
>> | GT
>> | LE
>> | GE
>> ;
>>
>> equalityOp
>> : EQ
>> | NEQ
>> ;
>>
>> addSubOp
>> : PLUS
>> | MINUS
>> ;
>>
>> mulDivOp
>> : MULT
>> | DIV ;
>>
>> atom
>> : INTEGER
>> | LP! arithmeticExpr RP!
>> ;
>>
>> LT : '<';
>> GT : '>';
>> LE : '<=';
>> GE : '>=';
>> EQ : '=';
>> NEQ : '!=';
>> PLUS: '+';
>> MINUS
>> : '-';
>> MULT: '*';
>> DIV : '/';
>> LP : '(';
>> RP : ')';
>> NOT : 'not';
>> AND : 'and';
>> OR : 'or';
>> INTEGER
>> : '0'..'9'+ ;
>> BOOLEAN : 'true' | 'false';
>> CONSTANT : ('a'..'z'|'A'..'Z')+ ;
>> NEWLINE:'\r'? '\n' ;
>> WS : (' '|'\t')+ {skip();} ;
>>
>> -- AH
>>
>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
>> Unsubscribe:
>> http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
> --
> Computer Bild Tarifsieger! GMX FreeDSL - Telefonanschluss + DSL
> für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a
>
--
Anders Hessellund
www.itu.dk/people/hessellund/
More information about the antlr-interest
mailing list