tree grammar Reduce; | |
options | |
{ | |
tokenVocab=VecMath; | |
ASTLabelType=CommonTree; | |
output=AST; | |
filter=true; | |
language=CSharp3; | |
} | |
@namespace{Antlr3.Runtime.Test.Composition} | |
/** Rewrite: x+x to be 2*x, 2*x to be x<<1, x<<n<<m to be x<<(n+m) */ | |
bottomup | |
: ^(PLUS i=INT j=INT {$i.int==$j.int}?) -> ^(MULT["*"] INT["2"] $j) | |
| ^(MULT x=INT {$x.int==2}? y=.) -> ^(SHIFT["<<"] $y INT["1"]) | |
| ^(SHIFT ^(SHIFT e=. n=INT) m=INT) | |
-> ^(SHIFT["<<"] $e INT[($n.int+$m.int).ToString()]) | |
; |