import java.io.*;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class Main {
    public static StringTemplateGroup templates;
    public static StringTemplate output = null;
    public static void main(String[] args) throws Exception {
	
		//Read the template file
		String stg = null;
		int a = 0;
		if ( args.length<=1 ) 
		{
			stg = "sal_prog_template.stg";
		}
		else 
		{
			stg = args[a];
			a++;
		}
		templates = new StringTemplateGroup(new FileReader(stg));

		//Parse input and build AST				
		ANTLRInputStream input = new ANTLRInputStream(System.in);
    		mLexer lexer = new mLexer(input);
		CommonTokenStream tokens = new CommonTokenStream(lexer);
		mParser parser = new mParser(tokens);
		mParser.program_return r1 = parser.program(); 
		CommonTree tree1 = (CommonTree)r1.getTree();
		if (r1 != null)
   		  System.out.println(tree1.toStringTree());

		System.out.println("\n");		

		//Build the tree grammar g
	     	CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree1);
		nodes.setTokenStream(tokens);
      	g grammar = new g(nodes);
		g.program_return r2 = grammar.program();
		CommonTree tree2 = (CommonTree)r2.getTree();
		if (r2 != null)
   		  System.out.println(tree2.toStringTree());

		System.out.println("\n");		

		//Build the template
		CommonTreeNodeStream nodes2 = new CommonTreeNodeStream(tree2);
		nodes2.setTokenStream(tokens);
      	t grammar2 = new t(nodes2);
		grammar2.setTemplateLib(templates);
            t.program_return r3 = grammar2.program(grammar.locals);
		output = (StringTemplate)r3.getTemplate(); 

		//writing the template to a file and the filename is given by the user
		/*JFrame frame = new JFrame();
		String file_name = (String)JOptionPane.showInputDialog(
				               frame,
				               "Enter the filename",
				               "File Name",
				               JOptionPane.INFORMATION_MESSAGE,
				               null,
				               null,
				               null);*/
		Writer out = null;
		File file = new File("C:/cygwin/home/swathy/sal-3.0/examples/mapcode-programs/a.sal");
 		out = new BufferedWriter(new FileWriter(file));
		out.write(output.toString());
		out.close();
		System.out.println("Your file has been written");  
    }
}
