Skip to content
Snippets Groups Projects
Select Git revision
  • 46e4136eb0756774ee997507b96569c7fff5d506
  • master default protected
2 results

Parser.java

Blame
  • Parser.java 4.01 KiB
    import java.util.List;
    
    public class Parser {
        public static ProgramHandler.Program parse(Lexer.LexerContainer container) {
            List<Token> tokens = container.tokens;
            List<String> vars = container.vars;
    
            ProgramHandler.Program program = new ProgramHandler.Program();
    
            while (!tokens.isEmpty()) {
                Token token = tokens.remove(0);
                if (token != Token.SemiColon) {
                    switch (token) {
                        case Clear -> {
                            if (tokens.remove(0) == Token.Var) {
                                ProgramHandler.ClearStatement statement = new ProgramHandler.ClearStatement();
                                statement.v = new ProgramHandler.Variable(vars.remove(0));
                                program.stmts.add(statement);
                            } else {
                                System.err.println("Clear not followed by variable");
                            }
                        }
                        case Incr -> {
                            if (tokens.remove(0) == Token.Var) {
                                ProgramHandler.IncrStatement statement = new ProgramHandler.IncrStatement();
                                statement.v = new ProgramHandler.Variable(vars.remove(0));
                                program.stmts.add(statement);
                            } else {
                                System.err.println("Incr not followed by variable");
                            }
                        }
                        case Decr -> {
                            if (tokens.remove(0) == Token.Var) {
                                ProgramHandler.DecrStatement statement = new ProgramHandler.DecrStatement();
                                statement.v = new ProgramHandler.Variable(vars.remove(0));
                                program.stmts.add(statement);
                            } else {
                                System.err.println("Decr not followed by variable");
                            }
                        }
                        case While -> {
                            ProgramHandler.WhileLoop loop = new ProgramHandler.WhileLoop();
                            Expression.Expr expr = eParse(container);
                            loop.expr = expr;
                            loop.p = parse(container);
                            program.stmts.add(loop);
                        }
                        case End -> {
                            return program;
                        }
                        case Var, Number -> {
                            System.err.println("Something went wrong, L for u. " + token + " " + tokens.get(0));
                        }
                    }
                }
            }
    
            return program;
        }
    
        private static Expression.Expr eParse(Lexer.LexerContainer container){
            List<Token> tokens = container.tokens;
            List<String> vars = container.vars;
            Expression.Expr e = null;
    
            while (!tokens.isEmpty()) {
                Token token = tokens.remove(0);
                switch (token) {
                    case Var -> {
                        if (e == null) {
                            e = new Expression.VarExpr(vars.remove(0));
                        } else {
                            System.err.println("Expression not valid");
                            System.exit(1);
                        }
                    } case Number -> {
                        if (e == null) {
                            e = new Expression.LiteralExpr(new Expression.IntVal(Integer.parseInt(vars.remove(0))));
                        } else {
                            System.err.println("Expression not valid");
                            System.exit(1);
                        }
                    } case Not -> {
                        if (e != null) {
                            Expression.Expr rhs = eParse(container);
                            e = new Expression.NotExpr(e, rhs);
                        }
                    } case Do, End, SemiColon -> {
                        return e;
                    }
                }
            }
            System.err.println("Expr never ended");
            System.exit(1);
            return new Expression.LiteralExpr(new Expression.IntVal(1));
        }
    }