@parser-generator/grammar-interpreter
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
197 lines • 6.6 kB
TypeScript
import { NonTerminal, Production, TokenPro, IGrammar, ParsingTable, SymbolTraits } from "@parser-generator/definition";
import { FirstTable, FollowTable } from "@parser-generator/core";
import { CommonAbstractRegexpLexer } from "@parser-generator/definition";
/*************************************** Lexical Analysis ****************************************/
export declare enum Tag {
BLANK = "BLANK",
CRLF = "CRLF",
EOF = "EOF",
NIL = "NIL",
HEAD = "HEAD",
SCRIPT = "SCRIPT",
STRING = "STRING",
STRING_SINGLE_QUOTES = "STRING_SINGLE_QUOTES",
STRING_DOUBLE_QUOTES = "STRING_DOUBLE_QUOTES",
NUMBER = "NUMBER",
WORD = "WORD",
SINGLE = "SINGLE",
ID = "ID",
KEYWORD = "KEYWORD",
ASSOC = "ASSOC"
}
declare abstract class Token {
protected _lineNo: number;
protected _colNo: number;
protected _tag: Tag;
constructor(tag: Tag);
setPos(lineNo: number, colNo: number): void;
get lineNo(): number;
get colNo(): number;
get tag(): Tag;
abstract get value(): Object;
toString(): string;
}
export declare class GrammarLexer extends CommonAbstractRegexpLexer<Token, Tag> {
private lineNo;
private colNo;
private reserves;
private eofToken;
constructor(text: string);
protected getEOF(): Token;
protected createToken(lexeme: string, type: Tag, match: RegExpExecArray): Token | undefined;
protected onMatchFaild(text: string, lastIndex: number): void;
}
/*************************************** AST ****************************************/
declare abstract class ASTree {
abstract accpet(visitor: IVisitor): void;
}
export declare class ProgramNode extends ASTree {
grammarNode: GrammarNode;
private blocks;
traits: SymbolTraits;
constructor(gNode: GrammarNode, paNode: PrecAssocNode | undefined, blocks: ASTree[]);
accpet(visitor: IVisitor): void;
}
declare class ScriptNode extends ASTree {
script: string;
constructor(t: Token);
accpet(visitor: IVisitor): void;
}
declare class PrecAssocNode extends ASTree {
children: PrecassocItemNode[];
constructor(children: PrecassocItemNode[]);
accpet(visitor: IVisitor): void;
}
declare class PrecassocItemNode extends ASTree {
symbol: Token;
leftAssoc: boolean;
prec: number;
constructor(tokens: (Token | undefined)[]);
accpet(visitor: IVisitor): void;
}
declare class Env {
private syms;
private rsyms;
private prods;
private rprods;
constructor();
registerSym(varName: string, sym: TokenPro | NonTerminal): void;
getSym(varName: string): TokenPro | NonTerminal;
hasSym(varName: string): boolean;
getSymVarName(sym: TokenPro | NonTerminal): string | undefined;
registerProd(prod: Production, varName: string): void;
getProdVarName(prod: Production): string;
getProd(varName: string): Production;
}
declare class GrammarNode extends ASTree {
private _env;
get env(): Env;
private prodNodes;
private ntNodes;
private tpNodes;
nts: NonTerminal[];
startSym: NonTerminal;
prodNodeGroups: any;
constructor(tNodes: TokenProNode[], ntNodes: NonTerminalNode[], prodNodes: ProductionNode[]);
accpet(visitor: IVisitor): void;
}
declare class TokenProNode extends ASTree {
token: Token;
varName: string;
constructor(token: Token);
accpet(visitor: IVisitor): void;
}
declare type RawSymbol = {
symToken: Token;
action: Token | undefined;
};
declare class ProductionNode extends ASTree {
preAction: Token | undefined;
postAction: Token | undefined;
left: Token;
rawBody: RawSymbol[];
varName: string;
ntVarName: string;
pid: number | undefined;
env: Env;
constructor(nt: Token, body: Token[]);
accpet(visitor: IVisitor): void;
}
declare class NonTerminalNode extends ASTree {
_varName: string;
token: Token;
prods: ProductionNode[];
constructor(token: Token, prods: ProductionNode[]);
get varName(): string;
accpet(visitor: IVisitor): void;
}
export declare function parse(lexer: GrammarLexer): ProgramNode;
/*************************************** Semantic Analysis ****************************************/
interface IVisitor {
visitProgramNode(node: ProgramNode): void;
visitScriptNode(node: ScriptNode): void;
visitGrammarNode(node: GrammarNode): void;
visitTokenProNode(node: TokenProNode): void;
visitNonterminalNode(node: NonTerminalNode): void;
visitProductionNode(node: ProductionNode): void;
visitPrecAssocNode(node: PrecAssocNode): void;
}
export declare type EvalContext = {
parser: ParserType;
};
export declare class EvalVisitor implements IVisitor {
private traits;
private nts;
private startSym;
private prods;
private env;
private context;
constructor(context: EvalContext);
private _grammar;
get grammar(): IGrammar;
visitProgramNode(node: ProgramNode): void;
visitScriptNode(node: ScriptNode): void;
visitGrammarNode(node: GrammarNode): void;
visitTokenProNode(node: TokenProNode): void;
visitNonterminalNode(node: NonTerminalNode): void;
visitProductionNode(node: ProductionNode): void;
visitPrecAssocNode(node: PrecAssocNode): void;
}
export declare type CodegenContext = {
firstTable?: FirstTable;
followTable?: FollowTable;
lrTable?: ParsingTable;
parser: "LL" | "SLR" | "LR1" | "LALR";
};
export declare class TSCodegenVisitor implements IVisitor {
private _code;
private context;
constructor(context: CodegenContext);
private emit;
private emitln;
get code(): string;
visitProgramNode(node: ProgramNode): void;
visitScriptNode(node: ScriptNode): void;
visitGrammarNode(node: GrammarNode): void;
visitTokenProNode(node: TokenProNode): void;
visitNonterminalNode(node: NonTerminalNode): void;
visitProductionNode(node: ProductionNode): void;
visitPrecAssocNode(node: PrecAssocNode): void;
}
/*************************************** ****************************************/
export declare type ParserType = "LL" | "SLR" | "LR1" | "LALR";
export declare type LangType = "TS" | "JS";
export declare type ParserGenConfig = {
parser: ParserType;
lang: LangType;
};
export declare function genParser(rawGrammar: string, { parser, lang }: ParserGenConfig): {
code: string;
grammar: IGrammar;
firstTable: FirstTable;
followTable: FollowTable;
lrTable: ParsingTable | undefined;
lrAutomata: import("@parser-generator/core").StateSet | undefined;
};
export {};
//# sourceMappingURL=interp.d.ts.map