Exemple #1
0
        public void SetVariable(RuntimeData runtime, Variable v, INumber value)
        {
            if ((v is Variable && value is Variable && (v as Variable).Name == (value as Variable).Name))
            {
                // x = xみたいに同じ名前の変数をそのまんま入れようとしてたら無視する
                if (v.Multi.Equals(runtime, (value as Variable).Multi) &&
                    v.Pow.Equals(runtime, (value as Variable).Pow))
                {
                    return;
                }
                else
                {
                    throw new RuntimeException("変数に同じ名前の変数を代入することはできません。", v);
                }
            }

            // 代入することがそもそもできるか確認する
            if ((value is IFormula && ContainsMember(value as IFormula, v)))
            {
                throw new RuntimeException("変数に回帰式を入れることはできません。", v);
            }


            // ブロックデータから検索して変数に代入する
            for (int i = this.blocks.Count - 1; i >= 0; i--)
            {
                if (this.blocks[i].Variables.ContainsKey(v.Name))
                {
                    if (value != null)
                    {
                        this.blocks[i].Variables[v.Name] = value;
                        if (this.setting.IsDebug)
                        {
                            Console.WriteLine("変数の値を上書きしました: {0, 10}:{1}", v.Name, value.ToString());
                        }
                        return;
                    }
                    else
                    {
                        this.blocks[i].Variables.Remove(v.Name);
                        if (this.setting.IsDebug)
                        {
                            Console.WriteLine("変数を削除しました: {0, 10}", v.Name);
                        }
                    }
                }
                if (!this.blocks[i].MoreScope)
                {
                    break;
                }
            }

            if (value != null)
            {
                this.NowBlock.Variables.Add(v.Name, value);
                if (this.setting.IsDebug)
                {
                    Console.WriteLine("変数を作成しました {0, 10}:{1}", v.Name, value.ToString());
                }
            }
        }
Exemple #2
0
        public static void Main(string[] args)
        {
            SaveDir = Application.StartupPath + "/save/";
            if (!Directory.Exists(SaveDir))
            {
                Directory.CreateDirectory(SaveDir);
            }


            RuntimeSetting setting = new RuntimeSetting();
            RuntimeData    data    = new Runtime.RuntimeData(setting);
            IFormula       formula = null;

            Analyzer.Analyzer analyzer = null;

            Console.WriteLine("============================");
            Console.WriteLine("    Func Calc ");
            Console.WriteLine("============================");
            for (;;)
            {
                Console.WriteLine(" 1. New Formula");
                Console.WriteLine(" 2. Show Functions");
                Console.WriteLine(" 3. Show Operators");
                if (formula != null)
                {
                    Console.WriteLine(" 4. Get Result");
                    Console.WriteLine(" 5. Run Addition Formula");
                    Console.WriteLine(" 6. Show DebugInformation");
                    Console.WriteLine(" 7. Show Expression Tree");
                    Console.WriteLine(" 8. Enabled DebugMode");
                }
                Console.WriteLine(" 9. Quit");
                char c = Console.ReadKey(true).KeyChar;
                Console.Clear();

                switch (c)
                {
                case '1':
                    setting = new RuntimeSetting();
                    data    = new RuntimeData(setting);
                    Console.WriteLine("Initialized FormulaRuntime");
                    Console.WriteLine("Input formula");
                    Console.Write("> ");
                    try {
                        analyzer = new Analyzer.Analyzer(Console.ReadLine());
                        Stopwatch sw1 = Stopwatch.StartNew();
                        formula = analyzer.GetResult() as IFormula;
                        sw1.Stop();
                        Console.WriteLine("Success! Time : " + sw1.Elapsed.ToString());
                    }
                    catch (SyntaxException ex) {
                        Console.WriteLine("構文エラーが発生しました。計算式の書式のミスを確認してください。");
                        Console.WriteLine("エラー : " + ex.Message);
                        Console.WriteLine("トークン : {0}", ex.Token);
                        Console.Write("場所 : ");
                        ConsoleColor cc = Console.BackgroundColor;
                        if (analyzer.Tokens == null)
                        {
                            Console.WriteLine("トークン情報がありませんでした");
                        }
                        else
                        {
                            foreach (var t in analyzer.Tokens)
                            {
                                if (t != ex.Token)
                                {
                                    Console.BackgroundColor = cc;
                                }
                                else
                                {
                                    Console.BackgroundColor = ConsoleColor.Red;
                                }
                                Console.Write(t.Text);
                            }
                        }
                        Console.BackgroundColor = cc; Console.WriteLine();
                        Console.WriteLine("詳細: \n{0}", ex.ToString());
                    }
                    catch (RuntimeException ex) {
                        Console.WriteLine("実行エラーが発生しました。");
                        Console.WriteLine("エラー : " + ex.Message);
                        Console.WriteLine("トークン : {0}", ex.Token);
                        Console.WriteLine("詳細: \n{0}", ex.ToString());
                    }
                    break;

                case '2':
                    foreach (var func in data.Functions)
                    {
                        StringBuilder param = new StringBuilder();
                        foreach (var p in func.Value.Parameter)
                        {
                            if (param.Length != 0)
                            {
                                param.Append(", ");
                            }
                            param.Append(p.ToString());
                        }
                        Console.WriteLine("{0}({1}) - {2}",
                                          func.Value.Name, param, func.Value.Description);
                    }
                    break;

                case '3':
                    Console.WriteLine("Prior. L  Op   R - Description");
                    foreach (var op in setting.Spec.Operations.OrderBy(d => d.Value).Reverse())
                    {
                        Console.WriteLine("{0,6} {1} {2,5} {3} - {4}",
                                          op.Value,
                                          op.Key.RequireLeftParameter ? "#" : " ",
                                          op.Key.Text,
                                          op.Key.RequireRightParameter ? "#" : " ",
                                          op.Key.Name);
                    }
                    break;

                case '4':
                    if (formula == null)
                    {
                        continue;
                    }
                    RuntimeData dd  = data.Clone() as RuntimeData;
                    Stopwatch   sw  = Stopwatch.StartNew();
                    var         res = formula.Eval(dd);
                    sw.Stop();
                    Console.WriteLine("Input  : " + analyzer.Line);
                    Console.WriteLine("Formula: " + formula.ToString());
                    Console.WriteLine("Result : " + (res == null ? "戻り値はありませんでした" : res.ToString()));
                    Console.WriteLine("Mathjax: " + (res == null ? "戻り値はありませんでした" : res.Output(OutputType.Mathjax)));
                    Console.WriteLine("Time   : " + sw.Elapsed.ToString());
                    Console.WriteLine("Variables:");
                    foreach (var block in data.Blocks)
                    {
                        foreach (var item in block.Variables)
                        {
                            Console.WriteLine("{0:10} : {1}", item.Key, item.Value);
                        }
                    }
                    break;

                case '5':
                    if (formula == null)
                    {
                        continue;
                    }
                    else
                    {
                        Console.WriteLine("Input Addition Formula:");
                        Console.Write(" >");
                        Analyzer.Analyzer anal = new Analyzer.Analyzer(
                            Console.ReadLine(), setting);
                        Console.WriteLine("Success!");
                        var d    = anal.GetResult();
                        var dres = d.Eval(data);
                        Console.WriteLine("Done. (ReturnVal: " +
                                          (dres == null ? "null" : dres.ToString()) + ")");
                    }
                    break;

                case '6':
                    if (formula == null)
                    {
                        continue;
                    }
                    data.OutputDebug();
                    break;

                case '7':
                    if (formula == null)
                    {
                        continue;
                    }
                    Console.WriteLine("Input  : " + analyzer.Line);
                    Console.WriteLine("Output Expression: " + formula.GetType().Name);
                    OutputFormula(data, formula, 0);
                    break;

                case '8':
                    if (formula == null)
                    {
                        continue;
                    }
                    if (!setting.IsDebug)
                    {
                        setting.IsDebug = true;
                        Console.WriteLine("Debug Enabled!");
                    }
                    else
                    {
                        setting.IsDebug = false;
                        Console.WriteLine("Debug Disabled!");
                    }
                    break;


                case '9': return;

                case 'w':
                    ToWritingMode(data);
                    break;

                default:
                    continue;
                }
                Console.WriteLine();
            }
        }