package uk.co.zonetora.fj;

import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import uk.co.zonetora.InputParser;
import uk.co.zonetora.RunnableWithString;
import uk.co.zonetora.fj.ast.lexer.Lexer;
import uk.co.zonetora.fj.ast.node.Start;
import uk.co.zonetora.fj.ast.parser.Parser;
import uk.co.zonetora.fj.model.ClassDecl;
import uk.co.zonetora.fj.passes.BuildModel;
import uk.co.zonetora.fj.typecheck.ClassTable;

public class Main {

	
	public static void main(String[] args) throws IOException {
		InputParser.parse(new RunnableWithString() {
			public String run(String arg) {
				return parseAndTypeCheck(arg);
			}
		});
	}


	public static String parseAndTypeCheck(String contents) {
		VariablePushbackReader vpr = new VariablePushbackReader(new StringReader(contents));
		Lexer lexer = new Lexer(vpr);
		Parser p = new Parser(lexer);
		try {
			Start start = p.parse();
			
			BuildModel bm = new BuildModel();
			start.apply(bm);
			List<ClassDecl> classes = bm.getClasses();
			
			ClassTable ct = new ClassTable();
			for(ClassDecl cd : classes) {
				ct.addClassDefinition(cd);
			}
			ct.validateClassTable();
			
		} catch(Throwable t) {
			t.printStackTrace();
			return "Error:" + t.getMessage();
		}
		return null;
		
	}
	
}
