package ir2.td7;

import ir2.td7.lexer.LexerDataTable;
import ir2.td7.lexer.RuleEnum;
import ir2.td7.parser.NonTerminalEnum;
import ir2.td7.parser.ParserDataTable;
import ir2.td7.parser.ProductionEnum;
import ir2.td7.parser.TerminalEnum;
import ir2.td7.parser.VersionEnum;
import ir2.td7.tools.ASTEvaluator;
import ir2.td7.tools.AnalyzerBuilder;
import ir2.td7.tools.Start;
import ir2.td7.tools.TerminalEvaluator;

import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;

import fr.umlv.tatoo.runtime.buffer.impl.ReaderWrapper;
import fr.umlv.tatoo.runtime.lexer.LexerTable;
import fr.umlv.tatoo.runtime.parser.ParserTable;
import fr.umlv.tatoo.runtime.tools.DataViewer;
import fr.umlv.tatoo.runtime.tools.builder.LexerBuilder;
import fr.umlv.tatoo.runtime.tools.builder.ParserBuilder;

public class BooleanExprMain {
	private final static LexerTable< RuleEnum > lexerTable = LexerDataTable.createTable();
	private final static ParserTable< TerminalEnum, NonTerminalEnum, ProductionEnum, VersionEnum > parserTable = ParserDataTable.createTable();
	
	public static void main(String[] args) throws Throwable{
		Reader reader;
		if (args.length>0) {
			reader = new FileReader(args[0]);
		} else {
			reader = new InputStreamReader(System.in);
		}
		final TerminalEvaluator<CharSequence> attributeEvaluator=new TerminalEvaluator<CharSequence>(){

			public String id(CharSequence data) {
				return data.toString();
			}

			public boolean value(CharSequence data) {
				return Boolean.parseBoolean(data.toString());
			}
			
		};
		final ASTEvaluator ast = new ASTEvaluator();
		//Analyzer.run(reader,attributeEvaluator,ast,NonTerminalEnum.start,null);
		
		ReaderWrapper wrapper = new ReaderWrapper(reader, null); // LocationTracker null !
		LexerBuilder< RuleEnum, ReaderWrapper > lexerBuilder = LexerBuilder.createBuilder(lexerTable, wrapper);
		ParserBuilder<  TerminalEnum, NonTerminalEnum, ProductionEnum, VersionEnum > parserBuilder = ParserBuilder.createParserBuilder(parserTable);
		
		lexerBuilder.setLexerErrorPolicy(new fr.umlv.tatoo.runtime.lexer.NoLexerErrorRecoveryPolicy<RuleEnum, ReaderWrapper>());
		
		AnalyzerBuilder.createAnalyzer(lexerBuilder, parserBuilder, attributeEvaluator, ast, DataViewer.< CharSequence>getTokenBufferViewer()).createLexer().run();
		
		Start start = ast.getStart();
		final PrintVisitor pVisitor = new PrintVisitor();
		start.accept(pVisitor, null);
		//final SymbolVisitor visitor = new SymbolVisitor();
		//start.accept(visitor, null);
		//final VisibilityVisitor visitor = new VisibilityVisitor();
		//start.accept(visitor, null);
	}

}
