...
And now, let's distribute scalar-vector multiplies. 4*1,2
= -> 4*1,4*2
.
Code Block |
---|
tree grammar Simplify;
options {
tokenVocab=VecMath; // use tokens from VecMath.g
ASTLabelType=CommonTree; // we're using CommonTree nodes
output=AST; // build ASTs from input AST
filter=true; // tree pattern matching, rewrited mode
}
topdown
: ^('*' INT ^(VEC (e+=.)+)) -> ^(VEC ^('*' INT $e)+)
;
bottomup
: ^('*' a=. b=INT {$b.int==0}?) -> $b // x*0 -> 0
;
|
Give it a shot:
Code Block |
---|
VecMathLexer lex = new VecMathLexer(input); CommonTokenStream tokens = new CommonTokenStream(lex); VecMathParser g = new VecMathParser(tokens); RuleReturnScope r = g.prog(); // launch parser by calling start rule CommonTree t = (CommonTree)r.getTree(); // get tree result System.out.println("Original tree: "+t.toStringTree()); CommonTreeNodeStream nodes = new CommonTreeNodeStream(t); Simplify s = new Simplify(nodes); t = (CommonTree)s.downup(t); System.out.println("Simplified tree: "+t.toStringTree()); |