[antlr-interest] Lexer rule with alternatives (Newbie question)
Johannes Luber
jaluber at gmx.de
Sat Nov 22 08:26:12 PST 2008
Петров Александр schrieb:
> Hello,
> why such grammar doesn't work properly:
> --------------------------------------------------------------------------------------
> expr :
> operand ((oper) operand)*
> ;
> //Correct operands
> operand :
> INT
> ;
> OPER: ('+'|'-'|'*'|'/')
> ;
> INT :
> ('0'..'9')+
> ;
> --------------------------------------------------------------------------------------
>> t+1
> line 0:3 mismatched input '+' expecting EOF
>
> But if I replace the Lexer rule by Parser rule:
>
> oper: ('+'|'-'|'*'|'/');
>
> All work as it should. Why I should't use Lexer rule with alternatives ?
The problem with your example is that in the expr rule you use oper, but
define OPER as rule. Did you overlook this while posting or does even
expr :
operand (OPER operand)*
;
not work? Nonetheless, the usual way to define operands is to create a
single rule for each operand and reference those lexer rules in a single
parser rule for convenience. As "oper: ('+'|'-'|'*'|'/');" creates
implicit lexer rules doing it this way simulates the described approach,
but there can be problems as '+' used in to different rules will create
two distinct token types which will cause a MismatchedTokenTypeException
later.
Johannes
>
> Thank you
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
>
More information about the antlr-interest
mailing list