Home | History | Annotate | Download | only in polydiff
      1 tree grammar Simplifier;
      2 options {
      3 	tokenVocab=Poly;
      4     language=ObjC;
      5 	ASTLabelType=CommonTree;
      6 	output=AST;
      7 	backtrack=true;
      8 //	rewrite=true; // works either in rewrite or normal mode
      9 }
     10 
     11 /** Match some common patterns that we can reduce via identity
     12  *  definitions.  Since this is only run once, it will not be
     13  *  perfect.  We'd need to run the tree into this until nothing
     14  *  changed to make it correct.
     15  */
     16 poly:	^('+' a=INT b=INT)	-> INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]]
     17 
     18 	|	^('+' ^('+' a=INT p=poly) b=INT)
     19 							-> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]])
     20 	
     21 	|	^('+' ^('+' p=poly a=INT) b=INT)
     22 							-> ^('+' $p INT[[NSString stringWithFormat:@"\%d", ($a.int+$b.int)\]])
     23 	
     24 	|	^('+' p=poly q=poly)-> { [[$p.tree toStringTree] isEqualToString:@"0"] }? $q
     25 							-> { [[$q.tree toStringTree] isEqualToString:@"0"] }? $p
     26 							-> ^('+' $p $q)
     27 
     28 	|	^(MULT INT poly)	-> {$INT.int==1}? poly
     29 							-> ^(MULT INT poly)
     30 
     31 	|	^('^' ID e=INT)		-> {$e.int==1}? ID
     32 							-> {$e.int==0}? INT[@"1"]
     33 							-> ^('^' ID INT)
     34 
     35 	|	INT
     36 	|	ID
     37 	;
     38