public double Calculate(string input) { Token EofToken = new Token { Type = TT.EOF }; var lexer = new CalculatorLexer(input); Src = new ParserSource <Token>(lexer, EofToken, lexer.Src.SourceFile) { TokenTypeToString = tt => ((TT)tt).ToString() }; var result = ExprSequence(); Src.Match((int)TT.EOF); return(result); }
double Atom() { TokenType la0, la1; #line 215 "Grammars.ecs" double result; #line default // Line 216: ( TT.Id | TT.Num | TT.LParen Expr TT.RParen ) la0 = (TokenType)_src.LA0; if (la0 == TT.Id) { var t = _src.MatchAny(); #line 216 "Grammars.ecs" result = Vars[(string)t.Value]; #line default } else if (la0 == TT.Num) { var t = _src.MatchAny(); #line 217 "Grammars.ecs" result = (double)t.Value; #line default } else if (la0 == TT.LParen) { _src.Skip(); result = Expr(); _src.Match((int)TT.RParen); } else { #line 219 "Grammars.ecs" result = double.NaN; #line 219 "Grammars.ecs" _src.Error(0, "Expected identifer, number, or (parens)"); #line default } // Line 222: greedy(TT.Exp Atom)* for (;;) { la0 = (TokenType)_src.LA0; if (la0 == TT.Exp) { la1 = (TokenType)_src.LA(1); if (la1 == TT.Id || la1 == TT.LParen || la1 == TT.Num) { _src.Skip(); var exp = Atom(); #line 222 "Grammars.ecs" result = Math.Pow(result, exp); #line default } else { break; } } else { break; } } #line 223 "Grammars.ecs" return(result); #line default }