/**
 * 
 */
package com.ibm.watson.dsm.parser.dsm;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;

import com.ibm.watson.dsm.parser.dsm.antlr.DSMGrammarLexer;
import com.ibm.watson.dsm.parser.dsm.antlr.DSMGrammarParser;
import com.ibm.watson.dsm.parser.dsm.antlr.DSMTreeGrammar;

/**
 * @author dawood
 *
 */
public class DSMParser {

    public  static void parse(File file) throws RecognitionException, IOException {
        parse(new FileReader(file));
    }
                
    public  static void parse(Reader reader) throws RecognitionException, IOException {

                BufferedReader bf = new BufferedReader(reader);
                String input = "", temp;
                while ((temp = bf.readLine()) != null) {
                        input += temp + "\n";
                }

                CharStream charStream = new ANTLRStringStream(input);
                DSMGrammarLexer lexer = new DSMGrammarLexer(charStream);
                TokenStream tokens = new CommonTokenStream(lexer);
                DSMGrammarParser parser = new DSMGrammarParser(tokens);

                System.out.println("\nStarted Parsing...");
                DSMGrammarParser.root_return r = parser.root(); // calls the Start symbol 'program' to parse the content.
                
                CommonTree t = (CommonTree)r.getTree();
                
                System.out.println("\nParsed...");
                DOTTreeGenerator gen = new DOTTreeGenerator();
                StringTemplate st = gen.toDOT(t);
                
                CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
                nodes.setTokenStream(tokens);
                DSMTreeGrammar walker = new DSMTreeGrammar(nodes);
                
                walker.root();
             
                System.out.println(st);
                
                // System.out.println("Parsed the content successfully.");
    }
    
    public static void main(String[] args) throws RecognitionException, IOException {
    	String rules = 
    	  "channel a(int aw, string[10] ax);\n"
    	+ "inertial b(int bw);\n"
    	+ "inertial c(int cw, string[10] cx);\n"
    	+ "a(p,z) += b(p), c(p, z) : (p > 40);\n"
    	+ "a(p,q) -= b(p), c(p,q) : [END];\n"
    	+ "a(x+40, COUNT(q)) += a(p,q), c(x, q) : (p > 40) : [END,MSEC=60];\n";
    	
    	DSMParser.parse(new StringReader(rules));
    	
    }

}
