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

  1. Close the member predicate with `]]`, e.g. `when (cond) [[ ... ]]`.
  2. 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


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)