Exemple #1
0
        //测试用
        public void test()
        {
            //测试print函数
            //FunctionBuilder foobuilder = Lex.TotalFunctionList.getFunctionBuilderByName("print");
            //SignTable s = new SignTable();
            //Sign a1 = new Sign(new DadaInt("", "12456"), "args");
            //Sign a2 = new Sign(new DadaInt("", "12456"), "args");
            //Sign a3 = new Sign(new DadaInt("", "12456"), "args");
            //s.Add(a1);
            //s.Add(a1);
            //s.Add(a1);
            //Function f = foobuilder.build(s);
            //f.run();



            /*
             * a=1;
             * while(a<100){
             *  a=a+1:
             *  print(a);
             * }
             *
             */


            //a=1;=====================================
            SignTable st1 = new SignTable();

            st1.Add(new Sign("a", "结果"));
            st1.Add(new Sign(new DadaInt("", "1")));
            AssignOperation ass = new AssignOperation(st1);

            //while(a<100)
            CirculateOperation cop       = new CirculateOperation();
            SignTable          condition = new SignTable();

            condition.Add(new Sign("a", "ConditionLeft"));
            condition.Add(new Sign("", "<"));
            condition.Add(new Sign(new DadaInt("", "1000"), "ConditionRight"));
            cop.setCondition(condition);

            //{
            List <Operation> cb = new List <Operation>();


            //a=a+1:
            SignTable st2 = new SignTable();

            st2.Add(new Sign("a", "结果"));
            st2.Add(new Sign("a"));
            st2.Add(new Sign("", "+"));
            st2.Add(new Sign(new DadaInt("", "1")));
            AssignOperation ass2 = new AssignOperation(st2);



            //print(a);
            FunctionBuilder print = Lex.TotalFunctionList.getFunctionBuilderByName("print");
            SignTable       st3   = new SignTable();

            st3.Add(new Sign(print));
            st3.Add(new Sign("a", "args"));
            AssignOperation ass3 = new AssignOperation(st3);

            //}
            cb.Add(ass2);
            cb.Add(ass3);
            cop.setCirculateBody(cb);



            //测试开始执行
            ass.doSomethings(Lex.TotalSignList);
            cop.doSomethings(Lex.TotalSignList);
        }
Exemple #2
0
        public static ClassTable TotalClassList = new ClassTable();          //存有哪些声明的类

        public Lex(String program)
        {
            List <String>    rawSentences  = program.Split('\n').ToList();
            List <SignTable> rawOperations = new List <SignTable>();

            for (int i = 0; i < rawSentences.Count; i++)
            {
                SignTable     tempT         = new SignTable();
                int           operationMode = 0;
                List <String> words         = rawSentences[i].Replace("\t", "").Replace(";", "").Split(' ').ToList();

                foreach (String word in words)
                {
                    if (word == "")
                    {
                        continue;
                    }
                    if (word[0] == '/' && word[1] == '/')
                    {
                        break;
                    }
                    if (word == "func")
                    {
                        operationMode = 2;
                        tempT.Add(new Sign(word, "保留字"));
                    }
                    else if (word == "while")
                    {
                        operationMode = 3;
                        tempT.Add(new Sign(word, "保留字"));
                    }
                    else
                    {
                        if (word == "return")
                        {
                            tempT.Add(new Sign(word, "保留字"));
                        }
                        else if (IsNumeric(word))
                        {
                            tempT.Add(new Sign(new DadaInt("", word)));
                        }
                        else if (IsMark(word))
                        {
                            tempT.Add(new Sign(word, "标点"));
                        }
                        else if (IsOperator(word))
                        {
                            tempT.Add(new Sign(word, "op"));
                        }
                        else
                        {
                            tempT.Add(new Sign(word, "id"));
                        }
                    }
                }
                if (operationMode == 0)
                {
                    operationMode = 1;
                }
                tempT.Add(new Sign(operationMode + "", "操作"));
                rawOperations.Add(tempT);
            }

            foreach (SignTable operation in rawOperations)
            {
                Console.WriteLine(operation);
            }
        }
Exemple #3
0
        public override void doSomethings(SignTable contextTable)
        {
            this.initSignTable(contextTable);
            SignTable runtimeTable = Utils.DeepCopy <SignTable>(this.signTable);//深拷贝运行时符号表

            //执行函数
            for (int i = 0; i < runtimeTable.size(); i++)
            {
                if (runtimeTable[i].content is FunctionBuilder)
                {
                    List <Sign> trueArgs = new List <Sign>();
                    for (int j = i + 1; j < signTable.size(); j++)
                    {//向后检索实参列表
                        if (runtimeTable[j].type == "args")
                        {
                            trueArgs.Add(runtimeTable[j]);
                        }
                        else
                        {
                            break;
                        }
                    }
                    Function f       = ((FunctionBuilder)runtimeTable[i].content).build(trueArgs);
                    MateData fResult = f.run();

                    runtimeTable[i].content = fResult;
                }
            }
            String s = "";


            //从上下中给变量赋值
            foreach (Sign sign in runtimeTable)
            {
                if (contextTable.has(sign.id))
                {
                    sign.content = contextTable.getSignById(sign.id).content;
                }
                else if (sign.content is Hashable)
                {
                    if (sign.id != "" && sign.id[0] != '-')
                    {
                        contextTable.Add(sign);
                    }
                }

                if (sign.type == "结果")
                {
                    continue;
                }
                if (sign.content is Hashable)
                {
                    s = s + sign.content.toString();
                }
                else if (sign.content == null)
                {
                    s = s + sign.type;
                }
            }
            DataTable dataTable = new DataTable();
            double    x         = double.Parse(dataTable.Compute(s, null).ToString());
            DadaInt   data      = new DadaInt("");

            data.setData(x.ToString());
            Sign ss = runtimeTable.Find((e) => e.type == "结果");

            //以下写的很乱,但功能是对的
            if (ss != null)
            {
                if (contextTable.has(ss.id))
                {
                    contextTable.getSignById(ss.id).content = ss.content;
                }
                else
                {
                    contextTable.Add(ss);
                }
            }
            if (ss != null)
            {
                contextTable.getSignById(ss.id).content = data;
            }
            else
            {
                result    = data;
                this.mean = "返回";
            }
        }