@jkearl/pratt
Version:
Pratt parser builder (along with simple tokenizer)
38 lines (37 loc) • 1.56 kB
TypeScript
export interface PrefixParselet<E, T extends Token> {
parse(parser: Parser<E, T>, token: T): E;
}
export interface InfixParselet<E, T extends Token> {
precedence: number;
parse(parser: Parser<E, T>, left: E, token: T): E;
}
export declare const PARENTHESES_PARSELET: PrefixParselet<any, any>;
export interface Token {
id: string;
value: string;
}
export declare class ParserBuilder<E, T extends Token> {
private tokenizer;
private prefixParselets;
private infixParselets;
constructor(tokenizer: (stream: string) => T[]);
registerInfix(tokenType: string, parselet: InfixParselet<E, T>): this;
registerPrefix(tokenType: string, parselet: PrefixParselet<E, T>): this;
prefix(tokenType: string, precedence: number, builder: (token: T, right: E) => E): this;
postfix(tokenType: string, precedence: number, builder: (left: E, token: T) => E): this;
infixLeft(tokenType: string, precedence: number, builder: (left: E, token: T, right: E) => E): this;
infixRight(tokenType: string, precedence: number, builder: (left: E, token: T, right: E) => E): this;
construct(): (input: string) => E;
}
declare class Parser<E, T extends Token> {
private tokens;
private prefixParselets;
private infixParselets;
constructor(tokens: T[], prefixParselets: Record<string, PrefixParselet<E, T>>, infixParselets: Record<string, InfixParselet<E, T>>);
match(expected: string): boolean;
parse(precedence?: number): E;
private getPrecedence;
private consume;
private look;
}
export {};