diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParser.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParser.java index 72220733..85c925f2 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParser.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParser.java @@ -19,16 +19,14 @@ final class PbsExprParser { PbsAst.Block parse(String message); } - private final PbsParserContext context; + private final PbsExprParserContext context; private final PbsTokenCursor cursor; - private final BlockParserDelegate blockParserDelegate; PbsExprParser( - final PbsParserContext context, + final PbsParserContext parserContext, final BlockParserDelegate blockParserDelegate) { - this.context = context; + this.context = new PbsExprParserContext(parserContext, blockParserDelegate); this.cursor = context.cursor(); - this.blockParserDelegate = blockParserDelegate; } /** @@ -38,6 +36,10 @@ final class PbsExprParser { return parseHandle(); } + private PbsAst.Expression parsePrecedenceExpression() { + return parseApply(); + } + private PbsAst.Expression parseHandle() { if (!cursor.match(PbsTokenKind.HANDLE)) { return parseElse(); @@ -128,7 +130,7 @@ final class PbsExprParser { private PbsAst.Expression parseSwitchExpression() { if (!cursor.match(PbsTokenKind.SWITCH)) { - return parseApply(); + return parsePrecedenceExpression(); } final var switchToken = cursor.previous(); @@ -610,31 +612,15 @@ final class PbsExprParser { } private PbsAst.Block parseSurfaceBlock(final String message) { - return blockParserDelegate.parse(message); + return context.parseSurfaceBlock(message); } private PbsToken consume(final PbsTokenKind kind, final String message) { - if (cursor.check(kind)) { - return cursor.advance(); - } - final var token = cursor.peek(); - report(token, ParseErrors.E_PARSE_EXPECTED_TOKEN, message + ", found " + token.kind()); - if (!cursor.isAtEnd()) { - return cursor.advance(); - } - return token; + return context.consume(kind, message); } private PbsToken consumeMemberName(final String message) { - if (cursor.check(PbsTokenKind.IDENTIFIER) || cursor.check(PbsTokenKind.ERROR)) { - return cursor.advance(); - } - final var token = cursor.peek(); - report(token, ParseErrors.E_PARSE_EXPECTED_TOKEN, message + ", found " + token.kind()); - if (!cursor.isAtEnd()) { - return cursor.advance(); - } - return token; + return context.consumeMemberName(message); } private Span span(final long start, final long end) { diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParserContext.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParserContext.java new file mode 100644 index 00000000..be841110 --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/parser/PbsExprParserContext.java @@ -0,0 +1,60 @@ +package p.studio.compiler.pbs.parser; + +import p.studio.compiler.pbs.ast.PbsAst; +import p.studio.compiler.pbs.lexer.PbsToken; +import p.studio.compiler.pbs.lexer.PbsTokenKind; +import p.studio.compiler.source.Span; + +final class PbsExprParserContext { + private final PbsParserContext parserContext; + private final PbsTokenCursor cursor; + private final PbsExprParser.BlockParserDelegate blockParserDelegate; + + PbsExprParserContext( + final PbsParserContext parserContext, + final PbsExprParser.BlockParserDelegate blockParserDelegate) { + this.parserContext = parserContext; + this.cursor = parserContext.cursor(); + this.blockParserDelegate = blockParserDelegate; + } + + PbsTokenCursor cursor() { + return cursor; + } + + PbsAst.Block parseSurfaceBlock(final String message) { + return blockParserDelegate.parse(message); + } + + PbsToken consume(final PbsTokenKind kind, final String message) { + if (cursor.check(kind)) { + return cursor.advance(); + } + final var token = cursor.peek(); + report(token, ParseErrors.E_PARSE_EXPECTED_TOKEN, message + ", found " + token.kind()); + if (!cursor.isAtEnd()) { + return cursor.advance(); + } + return token; + } + + PbsToken consumeMemberName(final String message) { + if (cursor.check(PbsTokenKind.IDENTIFIER) || cursor.check(PbsTokenKind.ERROR)) { + return cursor.advance(); + } + final var token = cursor.peek(); + report(token, ParseErrors.E_PARSE_EXPECTED_TOKEN, message + ", found " + token.kind()); + if (!cursor.isAtEnd()) { + return cursor.advance(); + } + return token; + } + + Span span(final long start, final long end) { + return parserContext.span(start, end); + } + + void report(final PbsToken token, final ParseErrors parseErrors, final String message) { + parserContext.report(token, parseErrors, message); + } +}