@parser-generator/definition
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
187 lines • 6.28 kB
TypeScript
import { Stack } from "@light0x00/shim";
import { IToken, TableKey } from "./lexical";
/*******************************************************************************************************
符号的原型
符号原型的作用是用于建立一种逻辑上的匹配关系.
对于终结符而言:
1. 值类型符号,对应于 比较值的token,比如 '==' ,没有原型, 分析过程中直接使用词素值匹配
2. 原型类型符号,对应于 比较类型的token, 比如 NUMBER ,其原型是一个TerminalPro对象, 分析过程中使用该对象匹配
对于非终结符:
3. 文法中左侧符号都会对应一个NonterminalPro对象,而产生式体中出现的非终结符,比如 A->aA ,第二个
例:
E->E1+F1
F->digit
- 终结符‘+’没有原型,分析时匹配词素值.
- 终结符 digit 的实例则不可枚举,1、2都digit,分析时不能以词素值为准,而是以原型为准,1、2的词素值不一样,但其原型一致,
这是一种逻辑相等关系.
- 非终结符E1的原型是E,F1的原型是F.
*******************************************************************************************************/
/**
* 非终结符符号原型
*/
export declare class NonTerminal implements TableKey {
private _name;
private _prods;
private _isStart;
constructor(name: string, isStart?: boolean, prods?: Production[]);
get name(): string;
get prods(): Production[];
set prods(ps: Production[]);
get isStart(): boolean;
toString(): string;
key(): SSymbol;
}
/**
* token原型
*/
export declare class TokenPro implements IToken {
private name;
constructor(name: string);
toString(): string;
key(): Terminal;
}
export declare const NIL: TokenPro;
export declare const EOF: TokenPro;
export declare type SSymbol = string | NonTerminal | TokenPro;
export declare type Terminal = TokenPro | string;
export declare function isNonTerminal(sym: Object): sym is NonTerminal;
export declare function isTerminal(sym: Object): sym is Terminal;
export declare type MidAction = ((stack: Stack<ASTElement>) => void);
export declare class SymbolWrapper {
private _value;
private _action;
constructor(sym: SSymbol, action?: MidAction);
get value(): string | NonTerminal | TokenPro;
get action(): MidAction | undefined;
isNonTerminal(): boolean;
isTerminal(): boolean;
isNIL(): boolean;
toString(): string;
}
/**
* 产生式
*/
export declare class Production {
private _id;
private _nt;
private _actionBody;
private _body;
private _preAction;
private _postAction;
private _leftAssoc;
private _prec;
constructor(id: number, nt: NonTerminal, body: SymbolWrapper[], preAction?: PreAction, postAction?: PostAction, leftAssoc?: boolean, prec?: number);
get id(): number;
get head(): NonTerminal;
get body(): SSymbol[];
get actionBody(): SymbolWrapper[];
get preAction(): PreAction | undefined;
get postAction(): PostAction;
get action(): PostAction;
get prec(): number;
set prec(val: number);
get leftAssoc(): boolean;
set leftAssoc(val: boolean);
isEpsilon(): boolean;
toString(): string;
}
export declare type PreAction = (stack: Stack<ASTElement>) => void;
export declare type PostAction = (eles: Array<ASTElement>, stack: Stack<ASTElement>) => ASTree;
/**
* 文法对象的api定义
*/
export interface IGrammar {
/**
* 获得文法的所有非终结符
*/
nonTerminals(): NonTerminal[];
/**
* 获得所有产生式
*/
productions(): Production[];
/**
* 获得文法的开始符号
*/
startNT(): NonTerminal;
}
/**
* 符号优先级、结合性
*/
export declare class SymbolTrait {
private _prec;
private _leftAssoc;
constructor(prec: number, leftAssoc: boolean);
get prec(): number;
get leftAssoc(): boolean;
compareTo(other: SymbolTrait): boolean;
}
export declare type SymbolTraits = Map<SSymbol, SymbolTrait>;
export declare class Grammar implements IGrammar {
protected nts: NonTerminal[];
protected prods: Production[];
protected traits: SymbolTraits;
protected startSym: NonTerminal;
constructor(nts: NonTerminal[], prods: Production[], startSymbol: NonTerminal, traits?: SymbolTraits);
protected validate(): void;
nonTerminals(): NonTerminal[];
productions(): Production[];
startNT(): NonTerminal;
toString(): string;
}
/*************************************** LR相关 ****************************************/
export declare class AugmentedGrammar extends Grammar {
protected validate(): void;
}
export declare abstract class Operation {
abstract equals(obj: Object): boolean;
isReduce(): this is Reduce;
isShift(): this is Shift;
isGoto(): this is Goto;
isAccept(): this is Accept;
}
export declare class Shift extends Operation {
private _nextStateId;
constructor(nextStateId: number);
get nextStateId(): number;
toString(): string;
equals(obj: Object): boolean;
isShift(): boolean;
}
export declare class Goto extends Operation {
private _nextStateId;
constructor(nextStateId: number);
get nextStateId(): number;
toString(): string;
equals(obj: Object): boolean;
isGoto(): boolean;
}
export declare class Reduce extends Operation {
private _prod;
constructor(prod: Production);
get prod(): Production;
toString(): string;
equals(obj: Object): boolean;
isReduce(): boolean;
}
export declare class Accept extends Operation {
constructor();
equals(obj: Object): boolean;
toString(): string;
isAccept(): boolean;
}
export declare class ParsingTable {
private parsingTable;
get table(): Map<number, Map<SSymbol, Operation>>;
put(state: number, symbol: SSymbol, op: Operation): void;
has(state: number, symbol: SSymbol, op: Operation): boolean;
get(state: number, symbol: SSymbol): Operation | undefined;
getExpectedSymbols(state: number): SSymbol[];
getExpectedTokens(state: number): SSymbol[];
}
/**
* 构成ASTree节点的元素
*/
export declare type ASTElement = IToken | ASTree;
export interface ASTree {
}
//# sourceMappingURL=syntax.d.ts.map