import spellu from '@spellu/core';
declare namespace spellu$calculator$4op { }
declare namespace spellu$calculator$4op {
    enum SyntaxType {
        Number = "Number+",
        BinaryExpression = "BinaryExpression",
        TokenNumber = "Number",
        TokenOpMultiple = "*",
        TokenOpDivide = "/",
        TokenOpAdd = "+",
        TokenOpSubtract = "-",
        TokenParenOpen = "(",
        TokenParenClose = ")"
    }
    type Node = spellu.Node<SyntaxType>;
    type Token = spellu.Token<SyntaxType>;
    interface NodeNumber extends Node {
        type: SyntaxType.Number;
        value: number;
    }
    interface NodeBinaryExpression extends Node {
        type: SyntaxType.BinaryExpression;
        operator: string;
        left: Node;
        right: Node;
    }
}
declare namespace spellu$calculator$4op {
    function Node<T extends Node>(type: SyntaxType, data: {}, range?: spellu.TextRange): T;
}
/**
 * EBNF
 * expr = term ( '+' term | '-' term )
 * term = factor ( '*' factor | '/' factor )
 * factor = number | '(' expr ')'
 * number = ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' )+
 */
declare namespace spellu$calculator$4op {
    function grammar(): spellu.Parser<Node>;
}
declare namespace spellu$calculator$4op {
    function parse(source: spellu.Source): spellu.Success<Node> | spellu.Failure<spellu.Diagnosis[]>;
    function trace(source: spellu.Source): spellu.TraceResult;
    function evaluate(node: Node): number;
}
export default spellu$calculator$4op;
