1tree grammar Reduce; 2 3options 4{ 5 tokenVocab=VecMath; 6 ASTLabelType=CommonTree; 7 output=AST; 8 filter=true; 9 language=CSharp3; 10} 11 12 13@members 14{ 15 //public override IAstRuleReturnScope Topdown() { return topdown(); } 16 public override IAstRuleReturnScope Bottomup() { return bottomup(); } 17} 18 19 20/** Rewrite: x+x to be 2*x, 2*x to be x<<1, x<<n<<m to be x<<(n+m) */ 21bottomup 22 : ^(PLUS i=INT j=INT {$i.int==$j.int}?) -> ^(MULT["*"] INT["2"] $j) 23 | ^(MULT x=INT {$x.int==2}? y=.) -> ^(SHIFT["<<"] $y INT["1"]) 24 | ^(SHIFT ^(SHIFT e=. n=INT) m=INT) 25 -> ^(SHIFT["<<"] $e INT[($n.int+$m.int).ToString()]) 26 ; 27