apple/pkl · error · ParserError
unexpectedToken
unexpectedToken
Error message
Unexpected token `{text}`. Expected `]]`. What it means
Parser error in ParserImpl.parseMemberPredicate: while parsing a `when`-style member predicate, the parser consumed the closing expression but the token found was not the required `]]` terminator. The input at fault is a member predicate whose closing double bracket is missing or mistyped.
Solutions
- Close the member predicate with `]]`, e.g. `when (cond) [[ ... ]]`.
- Check for a stray token between the predicate expression and its terminator.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java:723 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08).
Data as JSON: /api/errors/f7c44de89eccb329.
Report an issue: GitHub.
Appendix: source
Thrown at pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java:723
var nodes = new ArrayList<@Nullable Node>(modifiers.size() + 6);
nodes.addAll(modifiers);
nodes.add(new Keyword(function));
nodes.add(identifier);
nodes.add(params);
nodes.add(args);
nodes.add(typeAnnotation);
nodes.add(expr);
return new ObjectMember.ObjectMethod(nodes, modifiers.size(), start.endWith(expr.span()));
}
private ObjectMember parseMemberPredicate() {
var start = next().span;
var pred = parseExpr("]]");
var firstBrack = expect(Token.RBRACK, "unexpectedToken", "]]").span;
Span secondbrack;
if (lookahead != Token.RBRACK) {
var text = _lookahead.text(lexer);
throw new ParserError(ErrorMessages.create("unexpectedToken", text, "]]"), firstBrack);
} else {
secondbrack = next().span;
}
if (firstBrack.charIndex() != secondbrack.charIndex() - 1) {
// There shouldn't be any whitespace between the first and second ']'.
var span = firstBrack.endWith(secondbrack);
var text = lexer.textFor(span.charIndex(), span.length());
throw new ParserError(ErrorMessages.create("unexpectedToken", text, "]]"), firstBrack);
}
if (lookahead == Token.ASSIGN) {
next();
var expr = parseExpr("}");
return new ObjectMember.MemberPredicate(List.of(pred, expr), start.endWith(expr.span()));
}
var bodies = parseBodyList();
var end = bodies.get(bodies.size() - 1).span();
var nodes = new ArrayList<@Nullable Node>(bodies.size() + 2);
nodes.add(pred);View on GitHub (pinned to f3efcbfc9b)