Beispiel #1
0
        public override Value Invoke(Value[] args)
        {
            NestedEnv env = new NestedEnv(Env);

            if (CheckAndFill(args, Params, ParamTypes, Defaults, env, false, out string err))
            {
                return(Body.GetValue(null, env));
            }
            else
            {
                Value r = NilValue.Nil;
                r["err"] = new StringValue(err);
                return(r);
            }
        }
Beispiel #2
0
        public static void TestParser()
        {
            string       s      = "(996 + 1.2 - 6 * (prev - 1) / prev - 3 * 5 * 13.6 / ext / k)";
            StringReader reader = new StringReader(s);
            TokenStream  ts     = new TokenStream(reader);

            ts.AddTokenizers(
                new IdTokenizer(),
                new DecimalTokenizer(),
                new DigitTokenizer(),
                new StringTokenizer(),
                new NameTokenizer()
                );

            Parser parser = CreateProgramParser();

            NestedEnv       env = Buildin.CreateBuindinEnv();
            List <IASTNode> res = new List <IASTNode>();

            Console.Write(">>> ");
            while ((s = Console.ReadLine()) != ".exit")
            {
                ts.Reset(new StringReader(s));
                if (!parser.Parse(ts, res) || res.Count == 0)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Parse failed");
                    Console.ResetColor();
                }
                else
                {
                    IASTNode node = res[0].Reduce();
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Parse succeeded");
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine(node.ToString());
                    Console.ResetColor();
                    string result = node.GetValue(null, env).ToString();
                    Console.WriteLine();
                    Console.ForegroundColor = ConsoleColor.Blue;
                    Console.WriteLine("==> " + result);
                    Console.ResetColor();
                    //PrintAST(node);
                }
                res.Clear();
                Console.Write(">>> ");
            }
        }