"git@git.soton.ac.uk:mhby1g21/Internship-Tools-by-Mona.git" did not exist on "main"
Select Git revision
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));
}
}