blob: 0ed570baa27b6ac02e98947331372b771d736fa7 [file] [log] [blame]
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()])
;