implements PR-11.1
This commit is contained in:
parent
3dca7396bb
commit
4131fb27c0
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user