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

  1. Enclose the keyword in backticks to use it as an identifier: `if` = 1.
  2. Rename the member to a non-keyword identifier if backticks are not required downstream.
  3. Remove the stray keyword line if it was accidental (e.g. leftover from an edit).
  4. 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

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)