| tree grammar Simplifier; |
| options { |
| tokenVocab=Poly; |
| language=ObjC; |
| ASTLabelType=CommonTree; |
| output=AST; |
| backtrack=true; |
| // rewrite=true; // works either in rewrite or normal mode |
| } |
| |
| /** Match some common patterns that we can reduce via identity |
| * definitions. Since this is only run once, it will not be |
| * perfect. We'd need to run the tree into this until nothing |
| * changed to make it correct. |
| */ |
| poly: ^('+' a=INT b=INT) -> INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]] |
| |
| | ^('+' ^('+' a=INT p=poly) b=INT) |
| -> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]]) |
| |
| | ^('+' ^('+' p=poly a=INT) b=INT) |
| -> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]]) |
| |
| | ^('+' p=poly q=poly)-> { [[$p.tree toStringTree] isEqualToString:@"0"] }? $q |
| -> { [[$q.tree toStringTree] isEqualToString:@"0"] }? $p |
| -> ^('+' $p $q) |
| |
| | ^(MULT INT poly) -> {$INT.int==1}? poly |
| -> ^(MULT INT poly) |
| |
| | ^('^' ID e=INT) -> {$e.int==1}? ID |
| -> {$e.int==0}? INT[@"1"] |
| -> ^('^' ID INT) |
| |
| | INT |
| | ID |
| ; |