UNPKG

@jkearl/pratt

Version:

Pratt parser builder (along with simple tokenizer)

38 lines (37 loc) 1.56 kB
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 {};