...
ANTLR v3.2 will allow special rules for specifying expressions that are particularly efficient both in speed and space. Special rules will define either unary suffix operators, binary operators, or trinary operators by virtue of how they recurse. Precedence of operators is specified by the order in which the alternatives appear in the special rule. Associativity Left associativity is assumed. Right associativity is done with a token level optionsoption, T<associativity=right>
. The alternatives that are not specifying operators or that specify unary operators are grouped into a new rule. A special rule is rewritten into one that does not have left recursion. Semantic predicates are used to recurse more or less depending on the precedence of the next operator (first symbol of lookahead). Here is the special rule:
No Format |
---|
expr : e[0] ; // rewrite expr to this rule, which invokes the precedence engine
/** "Precedence climbing" engine
parse_expr[int p]
: (primary->primary)
( {prec[input.LA(1)]>=p}?=> bop r=e[nextp(p)] -> ^(bop $e $r)
| {postprec[input.LA(1)]>=p}?=> suffix[$e.tree] -> {$suffix.tree}
)*
;
|
If you specify a rule with option parser=precedence, ANTLR does the new magical thing:
No Format |
---|
e options {parser=precedence;} : primary // highest precedence | exponent | e '++' | e '.' ID // higher than array/method call | suffix | unary | '(' type ')' e // cast | e '*' e | e ('+'|'-') e // lowest precedence ; |