apple/pkl · error · ParserError
keywordNotAllowedHere
keywordNotAllowedHere
Error message
Keyword `{0}` is not allowed here.
If you must use this name as identifier, enclose it in backticks. What it means
A reserved keyword appeared where a module member (class, typealias, method, property) is expected. Pkl does not allow keywords as top-level identifiers unless enclosed in backticks, so parseModuleMember throws "Keyword `{0}` is not allowed here" and suggests backtick-escaping.
Solutions
- Enclose the keyword in backticks to use it as an identifier: `if` = 1.
- Rename the member to a non-keyword identifier if backticks are not required downstream.
- Remove the stray keyword line if it was accidental (e.g. leftover from an edit).
- If generated config, make the generator backtick-escape keys that collide with Pkl keywords.
Example fix
// before if = 3 // after `if` = 3
Defensive patterns
Strategy: type-guard
Validate before calling
// Backtick-escape Pkl keyword identifiers before emitting config const PKL_KEYWORDS = new Set(['abstract','amends','as','augments','class','default','else','extends','external','false','fixed','function','hidden','if','import','in','is','let','local','module','new','nothing','null','open','out','override','read','super','this','true','typealias','when']); const ident = (name) => PKL_KEYWORDS.has(name) ? '`' + name + '`' : name;
Type guard
const isPklKeyword = (name) => PKL_KEYWORDS.has(name);
Prevention
- Backtick-escape any generated identifier that matches a Pkl keyword.
- Prefer renaming keyword-like keys during JSON/YAML → Pkl conversion.
- Keep a keyword list in your code generator and test it.
When it happens
Trigger: Declaring a top-level property named with a keyword, e.g. `if = 1`, `class = ...`, `import = ...`; writing a keyword at top level by mistake (e.g. a stray `else` or `super` line); translation from JSON/YAML keys that collide with Pkl keywords.
Common situations: Converting JSON/YAML config whose keys are keyword-like (`is`, `in`, `out`, `type`); typos where an intended identifier matches a keyword; code generators emitting keys without keyword escaping.
Understand the failure class
Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.
Related errors
AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08).
Data as JSON: /api/errors/b4a57b368d46fae1.
Report an issue: GitHub.
Appendix: source
Thrown at pkl-parser/src/main/java/org/pkl/parser/ParserImpl.java:351
case TYPE_ALIAS -> {
var node = parseTypeAlias(header);
nodes.add(node);
return node.span();
}
case CLASS -> {
var node = parseClass(header);
nodes.add(node);
return node.span();
}
case FUNCTION -> {
var node = parseClassMethod(header);
nodes.add(node);
return node.span();
}
case EOF -> throw parserError("unexpectedEndOfFile");
default -> {
if (lookahead.isKeyword()) {
throw parserError("keywordNotAllowedHere", lookahead.text());
}
if (lookahead == Token.DOC_COMMENT) {
throw parserError("danglingDocComment");
}
throw parserError("invalidTopLevelToken");
}
}
}
private TypeAlias parseTypeAlias(MemberHeader header) {
var typeAlias = next().span;
var startSpan = header.span(typeAlias);
var identifier = parseIdentifier();
TypeParameterList typePars = null;
if (lookahead == Token.LT) {
typePars = parseTypeParameterList();
}View on GitHub (pinned to f3efcbfc9b)