private static (IParseTree tree, string parseErrorMessage) TryParseExpression(string expression) { ICharStream stream = CharStreams.fromstring(expression); PolynomialLexer lexer = new PolynomialLexer(stream); ITokenStream tokens = new CommonTokenStream(lexer); PolynomialParser parser = new PolynomialParser(tokens) { BuildParseTree = true }; parser.RemoveErrorListeners(); parser.AddErrorListener(new PolynomialErrorListener()); try { var tree = parser.parse(); return(tree, string.Empty); } catch (ParseCanceledException pce) { return(null, pce.Message); } }