aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-08 20:55:35 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-08 20:55:35 +0100
commit19235b59a39e82d5714ac60d8c5665bd44a0278f (patch)
tree3db60302775ef0f205a5b23114a84d22843e7c76 /src/main/java
parent91a1ca266f80927f8f06db0fc11e60c93dce7ca9 (diff)
Parse subtraction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java36
-rw-r--r--src/main/java/org/shedlang/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Tokeniser.java13
3 files changed, 42 insertions, 8 deletions
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index dcb06eb0..d6cef7d4 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -22,9 +22,23 @@ public class Parser {
UntypedExpressionNode left,
TokenIterator<TokenType> tokens
) {
+ return parseBinaryOperation(
+ TokenType.SYMBOL_PLUS,
+ UntypedBinaryOperator.ADD,
+ left,
+ tokens
+ );
+ }
+
+ private static UntypedExpressionNode parseBinaryOperation(
+ TokenType operatorTokenType,
+ UntypedBinaryOperator operator,
+ UntypedExpressionNode left,
+ TokenIterator<TokenType> tokens
+ ) {
var start = left.source().start();
- tokens.skip(TokenType.SYMBOL_PLUS);
+ tokens.skip(operatorTokenType);
// TODO: precedence
var right = parseTopLevelExpression(tokens);
@@ -33,7 +47,7 @@ public class Parser {
var source = start.to(end);
return new UntypedBinaryOperationNode(
- UntypedBinaryOperator.ADD,
+ operator,
left,
right,
source
@@ -307,6 +321,18 @@ public class Parser {
};
}
+ private static UntypedExpressionNode parseSub(
+ UntypedExpressionNode left,
+ TokenIterator<TokenType> tokens
+ ) {
+ return parseBinaryOperation(
+ TokenType.SYMBOL_MINUS,
+ UntypedBinaryOperator.SUB,
+ left,
+ tokens
+ );
+ }
+
static UntypedExpressionNode parseTopLevelExpression(TokenIterator<TokenType> tokens) {
var left = parsePrimaryExpression(tokens);
@@ -316,9 +342,15 @@ public class Parser {
case SYMBOL_PLUS -> {
left = parseAdd(left, tokens);
}
+
+ case SYMBOL_MINUS -> {
+ left = parseSub(left, tokens);
+ }
+
case SYMBOL_BANG, SYMBOL_PAREN_OPEN -> {
left = parseCall(left, tokens);
}
+
default -> {
return left;
}
diff --git a/src/main/java/org/shedlang/compiler/parser/TokenType.java b/src/main/java/org/shedlang/compiler/parser/TokenType.java
index c55f7149..9f439e03 100644
--- a/src/main/java/org/shedlang/compiler/parser/TokenType.java
+++ b/src/main/java/org/shedlang/compiler/parser/TokenType.java
@@ -20,6 +20,7 @@ public enum TokenType {
SYMBOL_COMMA,
SYMBOL_DOT,
SYMBOL_EQUALS,
+ SYMBOL_MINUS,
SYMBOL_PAREN_OPEN,
SYMBOL_PAREN_CLOSE,
SYMBOL_PLUS,
diff --git a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
index c26c512a..2f967452 100644
--- a/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Tokeniser.java
@@ -22,6 +22,11 @@ public class Tokeniser {
private static final RegexTokeniser<TokenType> tokeniser = new RegexTokeniser<>(
TokenType.UNKNOWN,
List.of(
+ RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z][A-Za-z0-9]*"),
+ RegexTokeniser.rule(TokenType.INT, "-?[0-9]+"),
+ RegexTokeniser.rule(TokenType.STRING, "\"(?:[^\\\\\"\n\r]|\\\\.)*\""),
+ RegexTokeniser.rule(TokenType.WHITESPACE, "[\r\n\t ]+"),
+
RegexTokeniser.rule(TokenType.SYMBOL_THIN_ARROW, "->"),
RegexTokeniser.rule(TokenType.SYMBOL_BANG, "!"),
@@ -31,15 +36,11 @@ public class Tokeniser {
RegexTokeniser.rule(TokenType.SYMBOL_COMMA, ","),
RegexTokeniser.rule(TokenType.SYMBOL_DOT, "\\."),
RegexTokeniser.rule(TokenType.SYMBOL_EQUALS, "="),
+ RegexTokeniser.rule(TokenType.SYMBOL_MINUS, "-"),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_OPEN, "\\("),
RegexTokeniser.rule(TokenType.SYMBOL_PAREN_CLOSE, "\\)"),
RegexTokeniser.rule(TokenType.SYMBOL_PLUS, "\\+"),
- RegexTokeniser.rule(TokenType.SYMBOL_SEMICOLON, ";"),
-
- RegexTokeniser.rule(TokenType.IDENTIFIER, "[A-Za-z][A-Za-z0-9]*"),
- RegexTokeniser.rule(TokenType.INT, "-?[0-9]+"),
- RegexTokeniser.rule(TokenType.STRING, "\"(?:[^\\\\\"\n\r]|\\\\.)*\""),
- RegexTokeniser.rule(TokenType.WHITESPACE, "[\r\n\t ]+")
+ RegexTokeniser.rule(TokenType.SYMBOL_SEMICOLON, ";")
)
);