tree grammar Reduce; options { tokenVocab=VecMath; ASTLabelType=CommonTree; output=AST; filter=true; language=CSharp3; } @members { //public override IAstRuleReturnScope Topdown() { return topdown(); } public override IAstRuleReturnScope Bottomup() { return bottomup(); } } /** 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()]) ;