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