Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            List <Variable> variables          = new List <Variable>();
            Dictionary <string, Function> func = new Dictionary <string, Function>();

            while (running)
            {
                Console.Write('>');
                string input = Console.ReadLine(); if (input.StartsWith("rem"))
                {
                    string s = input.Substring(3);
                    s = s.Trim();
                    Console.WriteLine(">> " + s);
                }
                else
                {
                    Lexer l = new Lexer();
                    l.ScanWhiteSpaces = true;
                    l.Scan(new StringReader(input));
                    Parser p = new Parser(l.tokens);
                    if (p.Parse())
                    {
                        foreach (Node n in p.tree)
                        {
                            if (n is Expression)
                            {
                                StackStuff stack = new StackStuff();
                                if (interpretExpression(stack, (Expression)n, variables, func))
                                {
                                    Console.WriteLine(">> " + string.Format("{0:N2}", stack.getResult()));
                                }
                            }
                            else if (n is Declaration)
                            {
                                StackStuff stack = new StackStuff();
                                if (interpretExpression(stack, ((Declaration)n).e, variables, func))
                                {
                                    if (!isVariable(variables, ((Declaration)n).name))
                                    {
                                        Variable v = new Variable();
                                        v.name  = ((Declaration)n).name;
                                        v.value = stack.getResult();
                                        variables.Add(v);
                                        Console.WriteLine(">> " + v.name + " = [" + v.value + "]");
                                    }
                                    else
                                    {
                                        Variable v = getVariable(variables, (((Declaration)n).name));
                                        v.value = stack.getResult();
                                        Console.WriteLine(">> " + v.name + " = [" + v.value + "]");
                                    }
                                }
                            }
                            else if (n is Function)
                            {
                                StackStuff      stack = new StackStuff();
                                List <Variable> vars  = new List <Variable>();

                                foreach (Declaration arg in ((Function)n).args)
                                {
                                    Variable v = new Variable();
                                    v.name = arg.name;
                                    vars.Add(v);
                                }

                                if (getFunction(func, ((Function)n).name) != null)
                                {
                                    func[((Function)n).name] = (Function)n;
                                }
                                else
                                {
                                    func.Add(((Function)n).name, (Function)n);
                                }

                                Console.WriteLine(">> " + ((Function)n).name + " => " + ((Function)n).exp);
                            }
                        }
                    }
                }
            }
        }