aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-27 20:08:28 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-27 20:08:28 +0100
commit59046902a85e7fd0a75195f50594cfad86e1bc51 (patch)
tree1e73f0541ddd427f6f695b37b270811cb6ffb1f6 /src/main/java
parent217cef25875d3ef04f055bed64752db9b2fbb21e (diff)
Parse field access
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedFieldAccessNode.java10
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java27
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
4 files changed, 41 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
index ad227d81..b1d7ba83 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExpressionNode.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.ast.untyped;
public sealed interface UntypedExpressionNode extends UntypedNode
- permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode, UntypedTupleNode {
+ permits UntypedBinaryOperationNode, UntypedBoolLiteralNode, UntypedCallNode, UntypedFieldAccessNode, UntypedIfNode, UntypedIntLiteralNode, UntypedReferenceNode, UntypedStringLiteralNode, UntypedTupleNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFieldAccessNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFieldAccessNode.java
new file mode 100644
index 00000000..f99a3c3c
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedFieldAccessNode.java
@@ -0,0 +1,10 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+
+public record UntypedFieldAccessNode(
+ UntypedExpressionNode receiver,
+ String fieldName,
+ Source source
+) implements UntypedExpressionNode {
+}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index eef01d28..831f5732 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -197,6 +197,7 @@ public class Parser {
}
private static final Map<TokenType, OperationParser> OPERATION_PARSERS = Stream.of(
+ new FieldAccessParser(),
new BinaryOperationParser(TokenType.SYMBOL_EQUALS_EQUALS, OperatorPrecedence.EQUALS, UntypedBinaryOperator.EQUALS),
new BinaryOperationParser(TokenType.SYMBOL_BANG_EQUALS, OperatorPrecedence.EQUALS, UntypedBinaryOperator.NOT_EQUAL),
new BinaryOperationParser(TokenType.SYMBOL_PLUS, OperatorPrecedence.ADD, UntypedBinaryOperator.ADD),
@@ -249,6 +250,32 @@ public class Parser {
: new UntypedExpressionStatementNode(expression, source);
}
+ private static class FieldAccessParser implements OperationParser {
+ @Override
+ public OperatorPrecedence precedence() {
+ return OperatorPrecedence.CALL;
+ }
+
+ @Override
+ public Stream<TokenType> operatorTokenTypes() {
+ return Stream.of(TokenType.SYMBOL_DOT);
+ }
+
+ @Override
+ public UntypedExpressionNode parse(UntypedExpressionNode left, TokenIterator<TokenType> tokens) {
+ var start = left.source().start();
+
+ tokens.skip(TokenType.SYMBOL_DOT);
+
+ var fieldName = tokens.nextValue(TokenType.IDENTIFIER);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedFieldAccessNode(left, fieldName, source);
+ }
+ }
+
private static UntypedNamespaceStatementNode parseFunctionDefinition(TokenIterator<TokenType> tokens) {
var start = tokens.position();
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 2d426428..eaeadf1a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -360,6 +360,9 @@ public class TypeChecker {
case UntypedCallNode untypedCall ->
typeCheckCall(untypedCall, context);
+ case UntypedFieldAccessNode untypedFieldAccessNode ->
+ throw new UnsupportedOperationException("TODO");
+
case UntypedIfNode untypedIf ->
typeCheckIf(untypedIf, context);