示例#1
0
        public object Evaluate(string formula)
        {
            if (string.IsNullOrEmpty(formula))
            {
                return(0);
            }

            var inputStream = new AntlrInputStream(formula);
            var lexer       = new FormulaLexer(inputStream);
            var tokens      = new CommonTokenStream(lexer);
            var parser      = new FormulaParser(tokens);

            var errorListener = new FormulaErrorListener();

            parser.RemoveErrorListeners();
            parser.AddErrorListener(errorListener);
            var parseTree = parser.main();

            if (!errorListener.IsValid)
            {
                throw new FormulaException(
                          errorListener.ErrorLocation,
                          errorListener.ErrorMessage);
            }

            return(new EvaluationVisitor(Functions).VisitMain(parseTree));
        }
        /// <summary>
        /// 翻译公式
        /// </summary>
        /// <param name="formula">公式</param>
        /// <param name="availableMethodsType">包含公式中可用静态方法的类型</param>
        /// <returns></returns>
        public string Interpret(string formula, Type availableMethodsType)
        {
            AntlrInputStream input = new AntlrInputStream(formula);
            FormulaLexer     lexer = new FormulaLexer(input);

            lexer.RemoveErrorListeners();
            lexer.AddErrorListener(LexerErrorListener.Instance);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            FormulaParser     parser = new FormulaParser(tokens);

            parser.RemoveErrorListeners();
            parser.AddErrorListener(ParserErrorListener.Instance);
            FormulaCSListener listener = new FormulaCSListener(availableMethodsType);

            ParseTreeWalker walker = new ParseTreeWalker();

            walker.Walk(listener, parser.formula());
            return(listener.Result);
        }