tree grammar PolyDifferentiator;
options {
	tokenVocab=Poly;
    language=ObjC;
	ASTLabelType=CommonTree;
	output=AST;
//	rewrite=true; // works either in rewrite or normal mode
}

poly:	^('+' poly poly)
	|	^(MULT INT ID)		-> INT
	|	^(MULT c=INT ^('^' ID e=INT))
		{
		NSString *c2 = [NSString stringWithFormat:@"\%d", $c.int*$e.int];
		NSString *e2 = [NSString stringWithFormat:@"\%d", $e.int-1];
		}
							-> ^(MULT[@"*"] INT[c2] ^('^' ID INT[e2]))
	|	^('^' ID e=INT)
		{
		NSString *c2 = [NSString stringWithFormat:@"\%d", $e.int];
		NSString *e2 = [NSString stringWithFormat:@"\%d", $e.int-1];
		}
							-> ^(MULT[@"*"] INT[c2] ^('^' ID INT[e2]))
	|	INT					-> INT[@"0"]
	|	ID					-> INT[@"1"]
	;