mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Мелкий рефакторинг парсера
This commit is contained in:
parent
75b5766d32
commit
55d892727d
@ -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());
|
||||||
@ -227,36 +227,37 @@ public final class Parser {
|
|||||||
// for key, value : arr || for (key, value : arr)
|
// for key, value : arr || for (key, value : arr)
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user