implements PR-11.1

This commit is contained in:
bQUARKz 2026-03-10 09:52:35 +00:00
parent 3dca7396bb
commit 4131fb27c0
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
2 changed files with 71 additions and 25 deletions

View File

@ -19,16 +19,14 @@ final class PbsExprParser {
PbsAst.Block parse(String message); PbsAst.Block parse(String message);
} }
private final PbsParserContext context; private final PbsExprParserContext context;
private final PbsTokenCursor cursor; private final PbsTokenCursor cursor;
private final BlockParserDelegate blockParserDelegate;
PbsExprParser( PbsExprParser(
final PbsParserContext context, final PbsParserContext parserContext,
final BlockParserDelegate blockParserDelegate) { final BlockParserDelegate blockParserDelegate) {
this.context = context; this.context = new PbsExprParserContext(parserContext, blockParserDelegate);
this.cursor = context.cursor(); this.cursor = context.cursor();
this.blockParserDelegate = blockParserDelegate;
} }
/** /**
@ -38,6 +36,10 @@ final class PbsExprParser {
return parseHandle(); return parseHandle();
} }
private PbsAst.Expression parsePrecedenceExpression() {
return parseApply();
}
private PbsAst.Expression parseHandle() { private PbsAst.Expression parseHandle() {
if (!cursor.match(PbsTokenKind.HANDLE)) { if (!cursor.match(PbsTokenKind.HANDLE)) {
return parseElse(); return parseElse();
@ -128,7 +130,7 @@ final class PbsExprParser {
private PbsAst.Expression parseSwitchExpression() { private PbsAst.Expression parseSwitchExpression() {
if (!cursor.match(PbsTokenKind.SWITCH)) { if (!cursor.match(PbsTokenKind.SWITCH)) {
return parseApply(); return parsePrecedenceExpression();
} }
final var switchToken = cursor.previous(); final var switchToken = cursor.previous();
@ -610,31 +612,15 @@ final class PbsExprParser {
} }
private PbsAst.Block parseSurfaceBlock(final String message) { private PbsAst.Block parseSurfaceBlock(final String message) {
return blockParserDelegate.parse(message); return context.parseSurfaceBlock(message);
} }
private PbsToken consume(final PbsTokenKind kind, final String message) { private PbsToken consume(final PbsTokenKind kind, final String message) {
if (cursor.check(kind)) { return context.consume(kind, message);
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;
} }
private PbsToken consumeMemberName(final String message) { private PbsToken consumeMemberName(final String message) {
if (cursor.check(PbsTokenKind.IDENTIFIER) || cursor.check(PbsTokenKind.ERROR)) { return context.consumeMemberName(message);
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;
} }
private Span span(final long start, final long end) { private Span span(final long start, final long end) {

View File

@ -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);
}
}