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