diff --git a/crates/cli/npm/dsl.d.ts b/crates/cli/npm/dsl.d.ts index 9ad40905..bfc89d5c 100644 --- a/crates/cli/npm/dsl.d.ts +++ b/crates/cli/npm/dsl.d.ts @@ -10,6 +10,7 @@ type PrecRightRule = { type: 'PREC_RIGHT'; content: Rule; value: number }; type PrecRule = { type: 'PREC'; content: Rule; value: number }; type Repeat1Rule = { type: 'REPEAT1'; content: Rule }; type RepeatRule = { type: 'REPEAT'; content: Rule }; +type ReservedRule = { type: 'RESERVED'; content: Rule; context_name: string }; type SeqRule = { type: 'SEQ'; members: Rule[] }; type StringRule = { type: 'STRING'; value: string }; type SymbolRule = { type: 'SYMBOL'; name: Name }; @@ -167,6 +168,17 @@ interface Grammar< * @see https://tree-sitter.github.io/tree-sitter/creating-parsers/3-writing-the-grammar#keyword-extraction */ word?: ($: GrammarSymbols) => RuleOrLiteral; + + + /** + * Mapping of names to reserved word sets. The first reserved word set is the + * global word set, meaning it applies to every rule in every parse state. + * The other word sets can be used with the `reserved` function. + */ + reserved?: Record< + string, + ($: GrammarSymbols) => RuleOrLiteral[] + >; } type GrammarSchema = { @@ -320,6 +332,15 @@ declare function repeat(rule: RuleOrLiteral): RepeatRule; */ declare function repeat1(rule: RuleOrLiteral): Repeat1Rule; +/** + * Overrides the global reserved word set for a given rule. The word set name + * should be defined in the `reserved` field in the grammar. + * + * @param wordset name of the reserved word set + * @param rule rule that will use the reserved word set + */ +declare function reserved(wordset: string, rule: RuleOrLiteral): ReservedRule; + /** * Creates a rule that matches any number of other rules, one after another. * It is analogous to simply writing multiple symbols next to each other diff --git a/crates/generate/src/dsl.js b/crates/generate/src/dsl.js index dd59efa6..faaace05 100644 --- a/crates/generate/src/dsl.js +++ b/crates/generate/src/dsl.js @@ -529,7 +529,7 @@ globalThis.optional = optional; globalThis.prec = prec; globalThis.repeat = repeat; globalThis.repeat1 = repeat1; -global.reserved = reserved; +globalThis.reserved = reserved; globalThis.seq = seq; globalThis.sym = sym; globalThis.token = token; diff --git a/docs/src/assets/schemas/grammar.schema.json b/docs/src/assets/schemas/grammar.schema.json index 12ed4d65..e30c7ba0 100644 --- a/docs/src/assets/schemas/grammar.schema.json +++ b/docs/src/assets/schemas/grammar.schema.json @@ -246,6 +246,21 @@ "required": ["type", "content"] }, + "reserved-rule": { + "type": "object", + "properties": { + "type": { + "type": "string", + "const": "RESERVED" + }, + "context_name": { "type": "string" }, + "content": { + "$ref": "#/definitions/rule" + } + }, + "required": ["type", "context_name", "content"] + }, + "token-rule": { "type": "object", "properties": { @@ -313,6 +328,7 @@ { "$ref": "#/definitions/choice-rule" }, { "$ref": "#/definitions/repeat1-rule" }, { "$ref": "#/definitions/repeat-rule" }, + { "$ref": "#/definitions/reserved-rule" }, { "$ref": "#/definitions/token-rule" }, { "$ref": "#/definitions/field-rule" }, { "$ref": "#/definitions/prec-rule" }