diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:08:28 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-27 20:08:28 +0100 |
| commit | 59046902a85e7fd0a75195f50594cfad86e1bc51 (patch) | |
| tree | 1e73f0541ddd427f6f695b37b270811cb6ffb1f6 /src/main/java | |
| parent | 217cef25875d3ef04f055bed64752db9b2fbb21e (diff) | |
Parse field access
Diffstat (limited to 'src/main/java')
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); |
