import type { IAlternative } from "../types.js"; import type { IAttribute } from "./IAttribute.js"; import type { IAttributeResolver } from "./IAttributeResolver.js"; import { LabelElementPair } from "./LabelElementPair.js"; import { Rule } from "./Rule.js"; import { ActionAST } from "./ast/ActionAST.js"; import { AltAST } from "./ast/AltAST.js"; import { GrammarAST } from "./ast/GrammarAST.js"; import { TerminalAST } from "./ast/TerminalAST.js"; /** An outermost alternative for a rule. We don't track inner alternatives. */ export declare class Alternative implements IAttributeResolver, IAlternative { ast: AltAST; /** Token IDs, string literals in this alt. */ readonly tokenRefs: Map; /** Does not include labels. */ readonly tokenRefsInActions: Map; /** All rule refs in this alt. */ readonly ruleRefs: Map; readonly ruleRefsInActions: Map; /** A list of all LabelElementPair attached to tokens like id=ID, ids+=ID */ readonly labelDefs: Map; /** * Track all executable actions other than named actions like `@init` and catch/finally (not in an alt). * Also tracks predicates, rewrite actions. We need to examine these actions before code generation so * that we can detect refs to $rule.attr etc... * * This tracks per alt. */ actions: ActionAST[]; /** What alternative number is this outermost alt? Used in templates. */ altNum: number; private rule; constructor(r: Rule, altNum: number); resolvesToToken(x: string, node: ActionAST): boolean; resolvesToAttributeDict(x: string, node: ActionAST): boolean; /** $x Attribute: rule arguments, return values, predefined rule prop. */ resolveToAttribute(x: string, node: ActionAST): IAttribute | null; /** * $x.y, x can be surrounding rule, token/rule/label ref. y is visible * attr in that dictionary. Can't see args on rule refs. */ resolveToAttribute(x: string, y: string, node: ActionAST): IAttribute | null; resolvesToLabel(x: string, node: ActionAST): boolean; resolvesToListLabel(x: string, node: ActionAST): boolean; getAnyLabelDef(x: string): LabelElementPair | null; /** x can be rule ref or rule label. */ resolveToRule(x: string): Rule | null; }