import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class Main {
public static void main(String[] args) throws Exception {
CharStream input = null;
if ( args.length>0 ) {
input = new ANTLRFileStream(args[0]);
}
else {
input = new ANTLRInputStream(System.in);
}
// BUILD AST
PolyLexer lex = new PolyLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lex);
PolyParser parser = new PolyParser(tokens);
PolyParser.poly_return r = parser.poly();
System.out.println("tree="+((Tree)r.tree).toStringTree());
// DIFFERENTIATE
CommonTreeNodeStream nodes = new CommonTreeNodeStream((Tree)r.tree);
nodes.setTokenStream(tokens);
PolyDifferentiator differ = new PolyDifferentiator(nodes);
PolyDifferentiator.poly_return r2 = differ.poly();
System.out.println("d/dx="+((Tree)r2.tree).toStringTree());
// SIMPLIFY / NORMALIZE
nodes = new CommonTreeNodeStream((Tree)r2.tree);
nodes.setTokenStream(tokens);
Simplifier reducer = new Simplifier(nodes);
Simplifier.poly_return r3 = reducer.poly();
System.out.println("simplified="+((Tree)r3.tree).toStringTree());
// CONVERT BACK TO POLYNOMIAL
nodes = new CommonTreeNodeStream((Tree)r3.tree);
nodes.setTokenStream(tokens);
PolyPrinter printer = new PolyPrinter(nodes);
PolyPrinter.poly_return r4 = printer.poly();
System.out.println(r4.st.toString());
}
}