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 {};
