import java.io.*;

public class Turtle {
    public static void main(String args[]) {
        if (args.length != 1) {
            System.out.println("Usage: java Turtle inputfile"); System.exit(0);
        }
        try {
            DataInputStream in = new DataInputStream(new FileInputStream(args[0]));
            Lexer lex = new Lexer(in);
            StatementTree result = parseProgram(lex);
            //  System.out.println("Program parsed successfully:");
            //  result.Accept(new PrintVisitor());
            //  System.out.println("Interpreting...");
            result.Accept(new InterpretVisitor());

        }
        catch (Exception e) {
            System.out.println(e);
        }
    }

    static StatementTree parseProgram(Lexer lex) throws IOException {

        lex.match(Token.PROGRAM);
        Token t = lex.nextToken();
        if (t.tokenId == Token.STRING) {
            System.out.println("Program name: "+t.string);
        } else {
            System.out.println("Syntax error: program name string expected");
        }
  
        return parseStatement(lex);
        
    }

    static StatementTree parseStatement(Lexer lex) throws IOException {
        Token t = lex.nextToken();
        switch (t.tokenId) {
        case Token.TURN:
            lex.match(Token.NUMBER);
            int degrees = lex.getLastToken().intValue;
            lex.match(Token.DEGREES);
            return new TurnNode(degrees);

        case Token.FORWARD:
??
??
??

        case Token.TIMES:
??
??
??
??
??

        case Token.BEGIN:
            StatementTreeList tl = parseStatementList(lex);
            return new BeginNode(tl);

        default:
            System.out.println("Syntax error: statement expected, "+t.string+
                               " found");
            return null;
        }
    }

    static StatementTreeList parseStatementList(Lexer lex) throws IOException {
        Token t = lex.nextToken();

        switch (t.tokenId) {
        case Token.END:
            return null; // nothing more to look for
        default:
            // if it's not the end, assume there's another stat

            lex.replaceToken(t);
            StatementTree first = parseStatement(lex);
            lex.match(Token.SEMICOLON);
            StatementTreeList rest = parseStatementList(lex);
            return new StatementTreeList(first, rest);
        }
    }
        
}
