{"record":{"id":"876641964b648763","repo":"apple/pkl","slug":"unexpectedtoken2-876641","errorCode":"unexpectedToken2","errorMessage":"Unexpected token `{0}`. Expected `{1}` or `{2}`.","messagePattern":"Unexpected token `(.+?)`\\. Expected `(.+?)` or `(.+?)`\\.","errorType":"exception","errorClass":"ParserError","httpStatus":null,"severity":"error","filePath":"pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java","lineNumber":1526,"sourceCode":"    return modifiers;\n  }\n\n  private ParameterList parseParameterList() {\n    var start = expect(Token.LPAREN, \"unexpectedToken\", \"(\").span;\n    Span end;\n    List<Parameter> args = new ArrayList<>();\n    if (lookahead == Token.RPAREN) {\n      end = next().span;\n    } else {\n      args = parseListOfParameter(Token.COMMA, Token.RPAREN);\n      end = expect(Token.RPAREN, \"unexpectedToken2\", \",\", \")\").span;\n    }\n    return new ParameterList(args, start.endWith(end));\n  }\n\n  private List<ObjectBody> parseBodyList() {\n    if (lookahead != Token.LBRACE) {\n      throw parserError(\"unexpectedToken2\", _lookahead.text(lexer), \"{\", \"=\");\n    }\n    var bodies = new ArrayList<ObjectBody>();\n    do {\n      bodies.add(parseObjectBody());\n    } while (lookahead == Token.LBRACE);\n    return bodies;\n  }\n\n  private TypeParameterList parseTypeParameterList() {\n    var start = expect(Token.LT, \"unexpectedToken\", \"<\").span;\n    var pars = parseListOf(Token.COMMA, Token.GT, this::parseTypeParameter);\n    var end = expect(Token.GT, \"unexpectedToken2\", \",\", \">\").span;\n    return new TypeParameterList(pars, start.endWith(end));\n  }\n\n  private TypeArgumentList parseTypeArgumentList() {\n    var start = expect(Token.LT, \"unexpectedToken\", \"<\").span;\n    var pars = parseListOf(Token.COMMA, Token.GT, this::parseType);","sourceCodeStart":1508,"sourceCodeEnd":1544,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java#L1508-L1544","documentation":"`parseBodyList` expects a Pkl object body member that is either a `{...}` object body or an `= ...` property assignment. When the first token of a body list member is not `{`, the parser throws `unexpectedToken2` listing both accepted tokens. This enforces that class/object members start with a body or assignment.","triggerScenarios":"Parsing an `amends`/class member list where a member starts with something other than `{` or `=`, e.g. a bare identifier or `,` where a body should be.","commonSituations":"Using JSON-style `name: value` inside a Pkl object body where `name { ... }` or `name = value` is required; copy-pasted YAML/JSON syntax into Pkl.","solutions":["Use `=` for property assignment: `x = 1`","Use `{ ... }` for object bodies: `x { y = 1 }`","Remove the invalid token if it is leftover from another syntax"],"exampleFix":"// before\nfoo: 1\n// after\nfoo = 1","handlingStrategy":"validation","validationCode":"function bodyMembersAreValid(src) {\n  return !/^\\s*\\w+\\s*:/m.test(src);\n}\n// Pkl object bodies do not use JSON-style `name: value`","typeGuard":null,"tryCatchPattern":"try { parse(src) } catch (e) {\n  if (String(e.message).includes('Expected \\\"{\\\" or \\\"=\\\"')) {\n    throw new Error('Pkl members must start with { or = : ' + e.message);\n  }\n  throw e;\n}","preventionTips":["Use `=` for assignments and `{ }` for nested objects in Pkl","Don't paste JSON/YAML `key: value` syntax into Pkl bodies","Convert converted configs with pkl's tooling rather than by hand"],"tags":["pkl","parser","object-body"],"backgroundTag":"parser-syntax-error","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}