Мелкий рефакторинг парсера

This commit is contained in:
Victor 2016-07-31 10:55:06 +03:00
parent 75b5766d32
commit 55d892727d

View File

@ -28,23 +28,23 @@ public final class Parser {
private static final Token EOF = new Token(TokenType.EOF, "", -1, -1); private static final Token EOF = new Token(TokenType.EOF, "", -1, -1);
private static final EnumMap<TokenType, BinaryExpression.Operator> assignOperator; private static final EnumMap<TokenType, BinaryExpression.Operator> ASSIGN_OPERATORS;
static { static {
assignOperator = new EnumMap(TokenType.class); ASSIGN_OPERATORS = new EnumMap(TokenType.class);
assignOperator.put(TokenType.EQ, null); ASSIGN_OPERATORS.put(TokenType.EQ, null);
assignOperator.put(TokenType.PLUSEQ, BinaryExpression.Operator.ADD); ASSIGN_OPERATORS.put(TokenType.PLUSEQ, BinaryExpression.Operator.ADD);
assignOperator.put(TokenType.MINUSEQ, BinaryExpression.Operator.SUBTRACT); ASSIGN_OPERATORS.put(TokenType.MINUSEQ, BinaryExpression.Operator.SUBTRACT);
assignOperator.put(TokenType.STAREQ, BinaryExpression.Operator.MULTIPLY); ASSIGN_OPERATORS.put(TokenType.STAREQ, BinaryExpression.Operator.MULTIPLY);
assignOperator.put(TokenType.SLASHEQ, BinaryExpression.Operator.DIVIDE); ASSIGN_OPERATORS.put(TokenType.SLASHEQ, BinaryExpression.Operator.DIVIDE);
assignOperator.put(TokenType.PERCENTEQ, BinaryExpression.Operator.REMAINDER); ASSIGN_OPERATORS.put(TokenType.PERCENTEQ, BinaryExpression.Operator.REMAINDER);
assignOperator.put(TokenType.AMPEQ, BinaryExpression.Operator.AND); ASSIGN_OPERATORS.put(TokenType.AMPEQ, BinaryExpression.Operator.AND);
assignOperator.put(TokenType.CARETEQ, BinaryExpression.Operator.XOR); ASSIGN_OPERATORS.put(TokenType.CARETEQ, BinaryExpression.Operator.XOR);
assignOperator.put(TokenType.BAREQ, BinaryExpression.Operator.OR); ASSIGN_OPERATORS.put(TokenType.BAREQ, BinaryExpression.Operator.OR);
assignOperator.put(TokenType.COLONCOLONEQ, BinaryExpression.Operator.PUSH); ASSIGN_OPERATORS.put(TokenType.COLONCOLONEQ, BinaryExpression.Operator.PUSH);
assignOperator.put(TokenType.LTLTEQ, BinaryExpression.Operator.LSHIFT); ASSIGN_OPERATORS.put(TokenType.LTLTEQ, BinaryExpression.Operator.LSHIFT);
assignOperator.put(TokenType.GTGTEQ, BinaryExpression.Operator.RSHIFT); ASSIGN_OPERATORS.put(TokenType.GTGTEQ, BinaryExpression.Operator.RSHIFT);
assignOperator.put(TokenType.GTGTGTEQ, BinaryExpression.Operator.URSHIFT); ASSIGN_OPERATORS.put(TokenType.GTGTGTEQ, BinaryExpression.Operator.URSHIFT);
assignOperator.put(TokenType.ATEQ, BinaryExpression.Operator.AT); ASSIGN_OPERATORS.put(TokenType.ATEQ, BinaryExpression.Operator.AT);
} }
private final List<Token> tokens; private final List<Token> tokens;
@ -185,7 +185,7 @@ public final class Parser {
} else { } else {
variables.add(null); variables.add(null);
} }
match(TokenType.COMMA); consume(TokenType.COMMA);
} }
consume(TokenType.EQ); consume(TokenType.EQ);
return new DestructuringAssignmentStatement(variables, expression()); return new DestructuringAssignmentStatement(variables, expression());
@ -228,35 +228,36 @@ public final class Parser {
return foreachMapStatement(); return foreachMapStatement();
} }
boolean openParen = match(TokenType.LPAREN); // необязательные скобки // for (init, condition, increment) body
boolean optParentheses = match(TokenType.LPAREN);
final Statement initialization = assignmentStatement(); final Statement initialization = assignmentStatement();
consume(TokenType.COMMA); consume(TokenType.COMMA);
final Expression termination = expression(); final Expression termination = expression();
consume(TokenType.COMMA); consume(TokenType.COMMA);
final Statement increment = assignmentStatement(); final Statement increment = assignmentStatement();
if (openParen) consume(TokenType.RPAREN); // скобки if (optParentheses) consume(TokenType.RPAREN); // close opt parentheses
final Statement statement = statementOrBlock(); final Statement statement = statementOrBlock();
return new ForStatement(initialization, termination, increment, statement); return new ForStatement(initialization, termination, increment, statement);
} }
private ForeachArrayStatement foreachArrayStatement() { private ForeachArrayStatement foreachArrayStatement() {
boolean openParen = match(TokenType.LPAREN); // необязательные скобки boolean optParentheses = match(TokenType.LPAREN);
final String variable = consume(TokenType.WORD).getText(); final String variable = consume(TokenType.WORD).getText();
consume(TokenType.COLON); consume(TokenType.COLON);
final Expression container = expression(); final Expression container = expression();
if (openParen) consume(TokenType.RPAREN); // скобки if (optParentheses) consume(TokenType.RPAREN); // close opt parentheses
final Statement statement = statementOrBlock(); final Statement statement = statementOrBlock();
return new ForeachArrayStatement(variable, container, statement); return new ForeachArrayStatement(variable, container, statement);
} }
private ForeachMapStatement foreachMapStatement() { private ForeachMapStatement foreachMapStatement() {
boolean openParen = match(TokenType.LPAREN); // необязательные скобки boolean optParentheses = match(TokenType.LPAREN);
final String key = consume(TokenType.WORD).getText(); final String key = consume(TokenType.WORD).getText();
consume(TokenType.COMMA); consume(TokenType.COMMA);
final String value = consume(TokenType.WORD).getText(); final String value = consume(TokenType.WORD).getText();
consume(TokenType.COLON); consume(TokenType.COLON);
final Expression container = expression(); final Expression container = expression();
if (openParen) consume(TokenType.RPAREN); // скобки if (optParentheses) consume(TokenType.RPAREN); // close opt parentheses
final Statement statement = statementOrBlock(); final Statement statement = statementOrBlock();
return new ForeachMapStatement(key, value, container, statement); return new ForeachMapStatement(key, value, container, statement);
} }
@ -426,13 +427,13 @@ public final class Parser {
} }
final TokenType currentType = get(0).getType(); final TokenType currentType = get(0).getType();
if (!assignOperator.containsKey(currentType)) { if (!ASSIGN_OPERATORS.containsKey(currentType)) {
pos = position; pos = position;
return null; return null;
} }
match(currentType); match(currentType);
final BinaryExpression.Operator op = assignOperator.get(currentType); final BinaryExpression.Operator op = ASSIGN_OPERATORS.get(currentType);
final Expression expression = expression(); final Expression expression = expression();
return new AssignmentExpression(op, (Accessible) targetExpr, expression); return new AssignmentExpression(op, (Accessible) targetExpr, expression);