import { TokenType } from './token';
export declare type Expression = BinaryExpression | UnaryExpression | ValueExpression | FunctionCallExpression | IdentifierExpression | CaseExpression | InExpression | GroupExpression | NotExpression;
export interface Node {
    readonly type: 'BinaryExpression' | 'UnaryExpression' | 'ValueExpression' | 'FunctionCallExpression' | 'IdentifierExpression' | 'CaseExpression' | 'InExpression' | 'GroupExpression' | 'NotExpression';
}
export declare class BinaryExpression implements Node {
    operator: TokenType;
    left: Expression;
    right: Expression;
    constructor(operator: TokenType, left: Expression, right: Expression);
    readonly type = "BinaryExpression";
}
export declare class UnaryExpression implements Node {
    operator: TokenType;
    operand: Expression;
    constructor(operator: TokenType, operand: Expression);
    readonly type = "UnaryExpression";
}
export declare class ValueExpression implements Node {
    value: any;
    constructor(value: any);
    readonly type = "ValueExpression";
}
export declare class FunctionCallExpression implements Node {
    name: string;
    args: Expression[];
    constructor(name: string, args: Expression[]);
    readonly type = "FunctionCallExpression";
}
export declare class IdentifierExpression implements Node {
    name: string;
    constructor(name: string);
    readonly type = "IdentifierExpression";
}
export declare class CaseExpression implements Node {
    conditions: {
        when: Expression;
        then: Expression;
    }[];
    last?: Expression | undefined;
    constructor(conditions: {
        when: Expression;
        then: Expression;
    }[], last?: Expression | undefined);
    readonly type = "CaseExpression";
}
export declare class InExpression implements Node {
    left: IdentifierExpression | GroupExpression;
    right: IdentifierExpression | GroupExpression;
    constructor(left: IdentifierExpression | GroupExpression, right: IdentifierExpression | GroupExpression);
    readonly type = "InExpression";
}
export declare class NotExpression implements Node {
    expression: Expression;
    constructor(expression: Expression);
    readonly type = "NotExpression";
}
export declare class GroupExpression implements Node {
    values: Expression[];
    constructor(values: Expression[]);
    readonly type = "GroupExpression";
}
