//测试用 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); }
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); } }
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 = "返回"; } }