Skip to content

Commit 50f636e

Browse files
committed
switch parsers
1 parent 7b6a5c5 commit 50f636e

File tree

6 files changed

+74
-46
lines changed

6 files changed

+74
-46
lines changed

pkl-core/src/main/java/org/pkl/core/ast/builder/AstBuilderNew.java

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -403,15 +403,16 @@ public UnresolvedTypeNode visitNullableType(NullableType type) {
403403
public UnresolvedTypeNode visitConstrainedType(ConstrainedType type) {
404404
var childNode = visitType(type.getType());
405405

406-
var exprs = type.getExpr();
407-
var constraints = new TypeConstraintNode[exprs.size()];
408-
for (int i = 0; i < constraints.length; i++) {
409-
var expr = visitExpr(exprs.get(i));
410-
constraints[i] = TypeConstraintNodeGen.create(expr.getSourceSection(), expr);
411-
}
412-
413406
return symbolTable.enterCustomThisScope(
414-
scope -> new Constrained(createSourceSection(type), childNode, constraints));
407+
scope -> {
408+
var exprs = type.getExpr();
409+
var constraints = new TypeConstraintNode[exprs.size()];
410+
for (int i = 0; i < constraints.length; i++) {
411+
var expr = visitExpr(exprs.get(i));
412+
constraints[i] = TypeConstraintNodeGen.create(expr.getSourceSection(), expr);
413+
}
414+
return new Constrained(createSourceSection(type), childNode, constraints);
415+
});
415416
}
416417

417418
@Override
@@ -1189,6 +1190,23 @@ private Pair<ExpressionNode[], Boolean> createCollectionArgumentNodes(ArgumentLi
11891190
return Pair.of(elementNodes, isConstantNodes);
11901191
}
11911192

1193+
@Override
1194+
public GeneratorMemberNode visitObjectMember(ObjectMemberNode member) {
1195+
if (member instanceof ObjectMemberNode.ObjectElement o) return visitObjectElement(o);
1196+
if (member instanceof ObjectMemberNode.ObjectProperty o) return visitObjectProperty(o);
1197+
if (member instanceof ObjectMemberNode.ObjectBodyProperty o) return visitObjectBodyProperty(o);
1198+
if (member instanceof ObjectMemberNode.ObjectMethod o) return visitObjectMethod(o);
1199+
if (member instanceof ObjectMemberNode.MemberPredicate o) return visitMemberPredicate(o);
1200+
if (member instanceof ObjectMemberNode.MemberPredicateBody o)
1201+
return visitMemberPredicateBody(o);
1202+
if (member instanceof ObjectMemberNode.ObjectEntry o) return visitObjectEntry(o);
1203+
if (member instanceof ObjectMemberNode.ObjectEntryBody o) return visitObjectEntryBody(o);
1204+
if (member instanceof ObjectMemberNode.ObjectSpread o) return visitObjectSpread(o);
1205+
if (member instanceof ObjectMemberNode.WhenGenerator o) return visitWhenGenerator(o);
1206+
if (member instanceof ObjectMemberNode.ForGenerator o) return visitForGenerator(o);
1207+
throw PklBugException.unreachableCode();
1208+
}
1209+
11921210
@Override
11931211
public GeneratorPropertyNode visitObjectProperty(ObjectProperty member) {
11941212
checkHasNoForGenerator(member, "forGeneratorCannotGenerateProperties");
@@ -1197,21 +1215,21 @@ public GeneratorPropertyNode visitObjectProperty(ObjectProperty member) {
11971215
}
11981216

11991217
@Override
1200-
public Object visitObjectBodyProperty(ObjectBodyProperty member) {
1218+
public GeneratorMemberNode visitObjectBodyProperty(ObjectBodyProperty member) {
12011219
checkHasNoForGenerator(member, "forGeneratorCannotGenerateProperties");
12021220
var memberNode = doVisitObjectProperty(member);
12031221
return GeneratorPropertyNodeGen.create(memberNode);
12041222
}
12051223

12061224
@Override
1207-
public Object visitObjectMethod(ObjectMethod memberNode) {
1225+
public GeneratorMemberNode visitObjectMethod(ObjectMethod memberNode) {
12081226
checkHasNoForGenerator(memberNode, "forGeneratorCannotGenerateMethods");
12091227
var member = doVisitObjectMethod(memberNode);
12101228
return GeneratorPropertyNodeGen.create(member);
12111229
}
12121230

12131231
@Override
1214-
public Object visitMemberPredicate(MemberPredicate member) {
1232+
public GeneratorMemberNode visitMemberPredicate(MemberPredicate member) {
12151233
var keyNodeAndMember = doVisitMemberPredicate(member);
12161234
var keyNode = keyNodeAndMember.first;
12171235
var memberNode = keyNodeAndMember.second;
@@ -1221,7 +1239,7 @@ public Object visitMemberPredicate(MemberPredicate member) {
12211239
}
12221240

12231241
@Override
1224-
public Object visitMemberPredicateBody(MemberPredicateBody member) {
1242+
public GeneratorMemberNode visitMemberPredicateBody(MemberPredicateBody member) {
12251243
var keyNodeAndMember = doVisitMemberPredicate(member);
12261244
var keyNode = keyNodeAndMember.first;
12271245
var memberNode = keyNodeAndMember.second;
@@ -1231,14 +1249,14 @@ public Object visitMemberPredicateBody(MemberPredicateBody member) {
12311249
}
12321250

12331251
@Override
1234-
public Object visitObjectElement(ObjectElement member) {
1252+
public GeneratorMemberNode visitObjectElement(ObjectElement member) {
12351253
var memberNode = doVisitObjectElement(member);
12361254
insertWriteForGeneratorVarsToFrameSlotsNode(memberNode.getMemberNode());
12371255
return GeneratorElementNodeGen.create(memberNode);
12381256
}
12391257

12401258
@Override
1241-
public Object visitObjectEntry(ObjectEntry member) {
1259+
public GeneratorMemberNode visitObjectEntry(ObjectEntry member) {
12421260
var keyNodeAndMember = doVisitObjectEntry(member);
12431261
var keyNode = keyNodeAndMember.first;
12441262
var memberNode = keyNodeAndMember.second;
@@ -1248,7 +1266,7 @@ public Object visitObjectEntry(ObjectEntry member) {
12481266
}
12491267

12501268
@Override
1251-
public Object visitObjectEntryBody(ObjectEntryBody member) {
1269+
public GeneratorMemberNode visitObjectEntryBody(ObjectEntryBody member) {
12521270
var keyNodeAndMember = doVisitObjectEntry(member);
12531271
var keyNode = keyNodeAndMember.first;
12541272
var memberNode = keyNodeAndMember.second;
@@ -1258,7 +1276,7 @@ public Object visitObjectEntryBody(ObjectEntryBody member) {
12581276
}
12591277

12601278
@Override
1261-
public Object visitObjectSpread(ObjectSpread member) {
1279+
public GeneratorMemberNode visitObjectSpread(ObjectSpread member) {
12621280
var scope = symbolTable.getCurrentScope();
12631281
var visitingIterable = scope.isVisitingIterable();
12641282
scope.setVisitingIterable(true);
@@ -1268,7 +1286,7 @@ public Object visitObjectSpread(ObjectSpread member) {
12681286
}
12691287

12701288
@Override
1271-
public Object visitWhenGenerator(WhenGenerator member) {
1289+
public GeneratorMemberNode visitWhenGenerator(WhenGenerator member) {
12721290
var sourceSection = createSourceSection(member);
12731291
var thenNodes = doVisitForWhenBody(member.getBody());
12741292
var elseNodes =
@@ -1302,7 +1320,7 @@ private int pushForGeneratorVariableContext(TypedIdent param) {
13021320
}
13031321

13041322
@Override
1305-
public Object visitForGenerator(ForGenerator member) {
1323+
public GeneratorMemberNode visitForGenerator(ForGenerator member) {
13061324
var sourceSection = createSourceSection(member);
13071325
int keyVariableSlot;
13081326
int valueVariableSlot;
@@ -2533,7 +2551,7 @@ private GeneratorMemberNode[] doVisitGeneratorMemberNodes(
25332551
List<? extends ObjectMemberNode> members) {
25342552
var result = new GeneratorMemberNode[members.size()];
25352553
for (var i = 0; i < result.length; i++) {
2536-
result[i] = (GeneratorMemberNode) visitObjectMember(members.get(i));
2554+
result[i] = visitObjectMember(members.get(i));
25372555
}
25382556
return result;
25392557
}

pkl-core/src/main/java/org/pkl/core/newparser/Parser.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,28 +56,30 @@
5656

5757
public class Parser {
5858

59-
private final Lexer lexer;
59+
private Lexer lexer;
6060
private Token lookahead;
6161
private Span spanLookahead;
6262
private boolean backtracking = false;
6363
private FullToken prev;
6464
private FullToken _lookahead;
65-
private final List<Comment> comments;
65+
private final List<Comment> comments = new ArrayList<>();
6666
private boolean precededBySemicolon = false;
6767

68-
public Parser(Lexer lexer) {
69-
this.lexer = lexer;
70-
comments = new ArrayList<>();
71-
_lookahead = forceNext();
72-
lookahead = _lookahead.token;
73-
spanLookahead = _lookahead.span;
74-
}
68+
public Parser() {}
7569

7670
public List<Comment> getComments() {
7771
return comments;
7872
}
7973

80-
public Module parseModule() {
74+
private void init(String source) {
75+
this.lexer = new Lexer(source);
76+
_lookahead = forceNext();
77+
lookahead = _lookahead.token;
78+
spanLookahead = _lookahead.span;
79+
}
80+
81+
public Module parseModule(String source) {
82+
init(source);
8183
if (lookahead == Token.EOF) {
8284
return new Module(
8385
null, List.of(), List.of(), List.of(), List.of(), List.of(), new Span(0, 0));

pkl-core/src/main/java/org/pkl/core/newparser/ParserError.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class ParserError extends RuntimeException {
1919
private final Span span;
2020

2121
public ParserError(String msg, Span span) {
22-
super(String.format("Error parsing file: %s\nat %s", msg, span));
22+
super(msg);
2323
this.span = span;
2424
}
2525

pkl-core/src/main/java/org/pkl/core/runtime/VmLanguage.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,12 +21,12 @@
2121
import com.oracle.truffle.api.TruffleLanguage.ContextPolicy;
2222
import com.oracle.truffle.api.nodes.Node;
2323
import com.oracle.truffle.api.source.Source;
24-
import org.pkl.core.ast.builder.AstBuilder;
24+
import org.pkl.core.ast.builder.AstBuilderNew;
2525
import org.pkl.core.module.ModuleKey;
2626
import org.pkl.core.module.ResolvedModuleKey;
27-
import org.pkl.core.parser.LexParseException;
28-
import org.pkl.core.parser.Parser;
29-
import org.pkl.core.parser.antlr.PklParser;
27+
import org.pkl.core.newparser.Parser;
28+
import org.pkl.core.newparser.ParserError;
29+
import org.pkl.core.newparser.cst.Module;
3030
import org.pkl.core.util.IoUtils;
3131
import org.pkl.core.util.Nullable;
3232

@@ -95,17 +95,18 @@ void initializeModule(
9595
VmTyped emptyModule,
9696
@Nullable Node importNode) {
9797
var parser = new Parser();
98-
PklParser.ModuleContext moduleContext;
98+
Module moduleContext;
9999
try {
100100
moduleContext = parser.parseModule(source.getCharacters().toString());
101-
} catch (LexParseException e) {
101+
} catch (ParserError e) {
102102
var moduleName = IoUtils.inferModuleName(moduleKey);
103-
MinPklVersionChecker.check(moduleName, e.getPartialParseResult(), importNode);
103+
// TODO: return a partial result to check here
104+
// MinPklVersionChecker.check(moduleName, e.getPartialParseResult(), importNode);
104105
throw VmUtils.toVmException(e, source, moduleName);
105106
}
106107

107108
var builder =
108-
AstBuilder.create(
109+
AstBuilderNew.create(
109110
source, this, moduleContext, moduleKey, resolvedModuleKey, moduleResolver);
110111
var moduleNode = builder.visitModule(moduleContext);
111112
moduleNode.getCallTarget().call(emptyModule, emptyModule);

pkl-core/src/main/java/org/pkl/core/runtime/VmUtils.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
2+
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -55,6 +55,7 @@
5555
import org.pkl.core.module.ModuleKey;
5656
import org.pkl.core.module.ModuleKeys;
5757
import org.pkl.core.module.ResolvedModuleKey;
58+
import org.pkl.core.newparser.ParserError;
5859
import org.pkl.core.parser.LexParseException;
5960
import org.pkl.core.parser.Parser;
6061
import org.pkl.core.parser.antlr.PklParser.ExprContext;
@@ -473,6 +474,16 @@ public static VmException toVmException(LexParseException e, Source source, Stri
473474
.build();
474475
}
475476

477+
// wanted to keep Parser/LexParseException API free from
478+
// Truffle classes (Source), hence put this method here
479+
public static VmException toVmException(ParserError e, Source source, String moduleName) {
480+
return new VmExceptionBuilder()
481+
.adhocEvalError(e.getMessage())
482+
.withSourceSection(source.createSection(e.span().charIndex(), e.span().length()))
483+
.withMemberName(moduleName)
484+
.build();
485+
}
486+
476487
public static @Nullable String exportDocComment(@Nullable SourceSection docComment) {
477488
if (docComment == null) return null;
478489

@@ -488,9 +499,6 @@ public static VmException toVmException(LexParseException e, Source source, Stri
488499
}
489500
}
490501
matcher.appendTail(builder);
491-
var newLength = builder.length() - 1;
492-
assert builder.charAt(newLength) == '\n';
493-
builder.setLength(newLength);
494502
return builder.toString();
495503
}
496504

pkl-core/src/test/kotlin/org/pkl/core/newparser/ParserComparisonTestInterface.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ interface ParserComparisonTestInterface {
6262

6363
companion object {
6464
private fun renderCode(code: String): String {
65-
val lexer = Lexer(code)
66-
val parser = Parser(lexer)
67-
val mod = parser.parseModule()
65+
val parser = Parser()
66+
val mod = parser.parseModule(code)
6867
val renderer = SexpRenderer()
6968
return renderer.render(mod)
7069
}

0 commit comments

Comments
 (0)