mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 22:31:52 +00:00
Refactor some parsing logic
This commit is contained in:
+20
-27
@@ -94,16 +94,18 @@ public class Parser {
|
|||||||
return new Executable(parseBlock(new Tokenizer(source), false, scopeBuilder), scopeBuilder);
|
return new Executable(parseBlock(new Tokenizer(source), false, scopeBuilder), scopeBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WhileKeyword parseWhileLoop(Tokenizer tokenizer, SourcePosition start, ScopeBuilder scopeBuilder) {
|
private WhileKeyword parseWhileLoop(Tokenizer tokenizer, ScopeBuilder scopeBuilder) {
|
||||||
|
SourcePosition start = tokenizer.consume().getPosition();
|
||||||
|
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_BEGIN);
|
||||||
Expression<?> first = parseLogicMathExpression(tokenizer, true, scopeBuilder);
|
Expression<?> first = parseLogicMathExpression(tokenizer, true, scopeBuilder);
|
||||||
ParserUtil.ensureReturnType(first, Expression.ReturnType.BOOLEAN);
|
ParserUtil.ensureReturnType(first, Expression.ReturnType.BOOLEAN);
|
||||||
|
|
||||||
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_END);
|
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_END);
|
||||||
|
|
||||||
return new WhileKeyword(parseStatementBlock(tokenizer, true, scopeBuilder), (Expression<Boolean>) first, start); // While loop
|
return new WhileKeyword(parseStatementBlock(tokenizer, true, scopeBuilder), (Expression<Boolean>) first, start); // While loop
|
||||||
}
|
}
|
||||||
|
|
||||||
private IfKeyword parseIfStatement(Tokenizer tokenizer, SourcePosition start, boolean controlStructure, ScopeBuilder scopeBuilder) {
|
private IfKeyword parseIfStatement(Tokenizer tokenizer, boolean controlStructure, ScopeBuilder scopeBuilder) {
|
||||||
|
SourcePosition start = tokenizer.consume().getPosition();
|
||||||
|
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_BEGIN);
|
||||||
Expression<?> condition = parseLogicMathExpression(tokenizer, true, scopeBuilder);
|
Expression<?> condition = parseLogicMathExpression(tokenizer, true, scopeBuilder);
|
||||||
ParserUtil.ensureReturnType(condition, Expression.ReturnType.BOOLEAN);
|
ParserUtil.ensureReturnType(condition, Expression.ReturnType.BOOLEAN);
|
||||||
|
|
||||||
@@ -131,7 +133,6 @@ public class Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Block parseStatementBlock(Tokenizer tokenizer, boolean controlStructure, ScopeBuilder scopeBuilder) {
|
private Block parseStatementBlock(Tokenizer tokenizer, boolean controlStructure, ScopeBuilder scopeBuilder) {
|
||||||
|
|
||||||
if(tokenizer.current().isType(Token.Type.BLOCK_BEGIN)) {
|
if(tokenizer.current().isType(Token.Type.BLOCK_BEGIN)) {
|
||||||
ParserUtil.ensureType(tokenizer.consume(), Token.Type.BLOCK_BEGIN);
|
ParserUtil.ensureType(tokenizer.consume(), Token.Type.BLOCK_BEGIN);
|
||||||
Block block = parseBlock(tokenizer, controlStructure, scopeBuilder);
|
Block block = parseBlock(tokenizer, controlStructure, scopeBuilder);
|
||||||
@@ -143,7 +144,9 @@ public class Parser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ForKeyword parseForLoop(Tokenizer tokenizer, SourcePosition start, ScopeBuilder scopeBuilder) {
|
private ForKeyword parseForLoop(Tokenizer tokenizer, ScopeBuilder scopeBuilder) {
|
||||||
|
SourcePosition start = tokenizer.consume().getPosition();
|
||||||
|
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_BEGIN);
|
||||||
scopeBuilder = scopeBuilder.sub(); // new scope
|
scopeBuilder = scopeBuilder.sub(); // new scope
|
||||||
Token f = tokenizer.current();
|
Token f = tokenizer.current();
|
||||||
ParserUtil.ensureType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER);
|
ParserUtil.ensureType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER);
|
||||||
@@ -226,18 +229,15 @@ public class Parser {
|
|||||||
private ConstantExpression<?> parseConstantExpression(Tokenizer tokenizer) {
|
private ConstantExpression<?> parseConstantExpression(Tokenizer tokenizer) {
|
||||||
Token constantToken = tokenizer.consume();
|
Token constantToken = tokenizer.consume();
|
||||||
SourcePosition position = constantToken.getPosition();
|
SourcePosition position = constantToken.getPosition();
|
||||||
switch(constantToken.getType()) {
|
return switch(constantToken.getType()) {
|
||||||
case NUMBER:
|
case NUMBER -> {
|
||||||
String content = constantToken.getContent();
|
String content = constantToken.getContent();
|
||||||
return new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position);
|
yield new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position);
|
||||||
case STRING:
|
}
|
||||||
return new StringConstant(constantToken.getContent(), position);
|
case STRING -> new StringConstant(constantToken.getContent(), position);
|
||||||
case BOOLEAN:
|
case BOOLEAN -> new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position);
|
||||||
return new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position);
|
default -> throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position);
|
||||||
default:
|
};
|
||||||
throw new UnsupportedOperationException(
|
|
||||||
"Unsupported constant token: " + constantToken.getType() + " at position: " + position);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression<?> parseGroup(Tokenizer tokenizer, ScopeBuilder scopeBuilder) {
|
private Expression<?> parseGroup(Tokenizer tokenizer, ScopeBuilder scopeBuilder) {
|
||||||
@@ -357,16 +357,9 @@ public class Parser {
|
|||||||
Token.Type.FAIL);
|
Token.Type.FAIL);
|
||||||
|
|
||||||
Expression<?> expression = switch(token.getType()) {
|
Expression<?> expression = switch(token.getType()) {
|
||||||
case FOR_LOOP, IF_STATEMENT, WHILE_LOOP -> {
|
case FOR_LOOP -> parseForLoop(tokenizer, scopeBuilder);
|
||||||
Token identifier = tokenizer.consume();
|
case IF_STATEMENT -> parseIfStatement(tokenizer, controlStructure, scopeBuilder);
|
||||||
ParserUtil.ensureType(tokenizer.consume(), Token.Type.GROUP_BEGIN);
|
case WHILE_LOOP -> parseWhileLoop(tokenizer, scopeBuilder);
|
||||||
yield switch(identifier.getType()) {
|
|
||||||
case FOR_LOOP -> parseForLoop(tokenizer, identifier.getPosition(), scopeBuilder);
|
|
||||||
case IF_STATEMENT -> parseIfStatement(tokenizer, identifier.getPosition(), controlStructure, scopeBuilder);
|
|
||||||
case WHILE_LOOP -> parseWhileLoop(tokenizer, identifier.getPosition(), scopeBuilder);
|
|
||||||
default -> throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
case IDENTIFIER -> {
|
case IDENTIFIER -> {
|
||||||
if(scopeBuilder.contains(token.getContent())) yield parseAssignment(tokenizer, scopeBuilder); // Assume variable assignment
|
if(scopeBuilder.contains(token.getContent())) yield parseAssignment(tokenizer, scopeBuilder); // Assume variable assignment
|
||||||
else yield parseFunction(tokenizer, true, scopeBuilder);
|
else yield parseFunction(tokenizer, true, scopeBuilder);
|
||||||
|
|||||||
Reference in New Issue
Block a user