Beispiel #1
0
        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);
        }
Beispiel #2
0
        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
        }