//项 private void Nape() { //因子 Factor(); if (flag == false) { return; } LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; while (lex.Type == LexicalAnalysis.STARSY || lex.Type == LexicalAnalysis.DIVISY) { i++; Factor(); //pcode if (lex.Type == LexicalAnalysis.STARSY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 4));//MUL codeAddr++; } else { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 5));//DIV codeAddr++; } lex = (LexicalAnalysisResult)Lexresult[i]; } return; }
//当型循环语句 private void WhileDoLoopCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.WHILESY) { return; } i++; //条件 int bufjpc = 0, bufcodeaddr = codeAddr; PCodes.Add(new PCode(codeAddr, PCode.JPC, 0, 0));//y值还需要改成后面的bufjpc codeAddr++; Condition(); lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.DOSY) { flag = false; Console.WriteLine("错误:此处应为do"); errors.Add(new Error("错误:应为do", lex.Line)); return; } i++; //语句 Code(); PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, bufcodeaddr));//y值为JPC所在位置 codeAddr++; bufjpc = codeAddr; PCode pc = (PCode)PCodes[bufcodeaddr]; pc.Y = bufjpc;//?? PCodes[bufcodeaddr] = pc; return; }
//复合语句 private void ComplexCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.BEGINSY) { flag = false; return; } i++; Code(); lex = (LexicalAnalysisResult)Lexresult[i]; while (lex.Type == LexicalAnalysis.SEMISY) { i++; Code(); lex = (LexicalAnalysisResult)Lexresult[i]; } if (lex.Type == LexicalAnalysis.ENDSY) { //PCODE 不知道该不该加 //PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 0)); //codeAddr++; i++; return; } else { flag = false; Console.WriteLine("错误:此处应为end或;"); errors.Add(new Error("错误:此处应为end或;", lex.Line)); return; } }
//语句部分 private void Code() { //等会儿再写这个233333 if (i >= Lexresult.Count) { return; } LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.IDSY) { AssignCode(); } else if (lex.Type == LexicalAnalysis.IFSY) { ConditionCode(); } else if (lex.Type == LexicalAnalysis.WHILESY) { WhileDoLoopCode(); } else if (lex.Type == LexicalAnalysis.CALLSY) { CallProcedure(); } else if (lex.Type == LexicalAnalysis.READSY) { ReadCode(); } else if (lex.Type == LexicalAnalysis.WRITESY) { WriteCode(); } else if (lex.Type == LexicalAnalysis.BEGINSY) { ComplexCode(); } else if (lex.Type == LexicalAnalysis.REPEAT) { RepeatCode(); } else { //empty //Console.WriteLine("Empty Code"); return; } if (flag == true) { //i++; return; } else { //错误处理 return; } }
//表达式 private void ExpressionCode() { //[+|-] bool minusflag = false; LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.PLUSSY) { //可以写PCODE /*PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); * codeAddr++; * PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, 0)); * codeAddr++;*/ i++; } else if (lex.Type == LexicalAnalysis.MINUSSY) { //可以写PCODE minusflag = true; /*PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); * codeAddr++; * PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, 0)); * codeAddr++;*/ i++; } //项 Nape(); if (minusflag == true) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 1));//转换为负数 codeAddr++; } lex = (LexicalAnalysisResult)Lexresult[i]; while (lex.Type == LexicalAnalysis.PLUSSY || lex.Type == LexicalAnalysis.MINUSSY) { i++; Nape(); //PCODE if (lex.Type == LexicalAnalysis.PLUSSY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 2));//ADD codeAddr++; } else { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 3));//SUB codeAddr++; } lex = (LexicalAnalysisResult)Lexresult[i]; } return; }
//分程序分析 private void Program() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; //先判断FIRST集 switch (lex.Type) { case LexicalAnalysis.CONSTSY: case LexicalAnalysis.VARSY: case LexicalAnalysis.PROCEDURE: case LexicalAnalysis.IDSY: case LexicalAnalysis.IFSY: case LexicalAnalysis.CALLSY: case LexicalAnalysis.BEGINSY: case LexicalAnalysis.WHILESY: case LexicalAnalysis.READSY: case LexicalAnalysis.WRITESY: break; default: flag = false; errors.Add(new Error("错误:程序开始的字符非法。", lex.Line)); return; //break; } //超出范围tryandcatch //常量说明部分 if (lex.Type == LexicalAnalysis.CONSTSY && i < Lexresult.Count) { i++; //进入常量说明部分分析 ConstIndicate(); } lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.VARSY && i < Lexresult.Count) { i++; //进入变量说明部分分析 VarIndicate(); } lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.PROCEDURE && i < Lexresult.Count) { i++; //过程说明部分子程序 ProcIndicate(); } //语句部分 Code(); return; }
//过程调用语句 //call+标识符 private void CallProcedure() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.CALLSY) { flag = false; return; } i++; lex = (LexicalAnalysisResult)Lexresult[i]; //标识符 if (lex.Type != LexicalAnalysis.IDSY) { flag = false; Console.WriteLine("错误:call后应为标识符"); errors.Add(new Error("错误:call后应为标识符", lex.Line)); return; } else { //符号表查找 //符号表检查 int preloc = -1; //之前的同一层符号表还没有检查 for (int ind = symbols.Count - 1; ind >= 0; ind--) { Symbols tempsym = (Symbols)symbols[ind]; if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level && tempsym.Type == (int)Symbols.SymTypes.PROC) { preloc = ind; break; } } if (preloc == -1) { flag = false; Console.WriteLine("错误:不存在符号{0}", lex.Content); errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line)); return; } //PCODE Symbols sym = (Symbols)symbols[preloc]; PCodes.Add(new PCode(codeAddr, PCode.CAL, level - sym.Level, sym.Value)); codeAddr++; i++; return; } }
void print() { String[] MNEMONIC = { "ERROR", "BEGINSY", "ENDSY", "IFSY", "THENSY", "ELSE", "CONSTSY", "VARSY", "PROCEDURE", "ODDSY", "WHILESY", "DOSY", "CALLSY", "WRITESY", "READSY", "REPEAT", "UNTILSY", "LESSSY", "MORESY", "POINTSY", "IDSY", "INTSY", "PLUSSY", "MINUSSY", "STARSY", "DIVISY","LPARSY", "RPARSY", "COMMASY", "SEMISY", "COLONSY", "ASSIGNSY", "EQUSY", "NOTEQUALSY", "NOTMORE", "NOTLESS", "LMBRACKET", "RMBRACKET" }; if (symbol > 35) { Console.WriteLine("ERROR,-"); } else { Console.Write("{0},", MNEMONIC[symbol]);// MNEMONIC[symbol] << ','; if (symbol == INTSY) { Console.WriteLine("{0}", num); //cout << num << endl; } else if (symbol == IDSY) { Console.WriteLine(token); //cout << token << endl; } else { Console.WriteLine("-"); //cout << "-" << endl; } if (MNEMONIC[symbol].Equals("ERROR")) { Form1.ShowError("错误:输入非法。", 0); Lexicals.Clear(); } else { LexicalAnalysisResult R = new LexicalAnalysisResult(); R.Type = symbol; R.Line = line; if (symbol == INTSY) { R.Content = num.ToString(); } else if (symbol == IDSY) { R.Content = token; } else { R.Content = ""; } Lexicals.Add(R); } } }
//条件语句 private void ConditionCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.IFSY) { //flag = false; //Console.WriteLine("错误:此处应为if"); return; } i++; Condition(); lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.THENSY) { flag = false; Console.WriteLine("错误:缺少then"); errors.Add(new Error("错误:缺少then", lex.Line)); return; } i++; int bufjpc = 0, bufcodeaddr = codeAddr; PCodes.Add(new PCode(codeAddr, PCode.JPC, 0, 0));//y值还需要改成后面的bufjpc codeAddr++; Code(); //i++ lex = (LexicalAnalysisResult)Lexresult[i]; bufjpc = codeAddr; PCode pc = (PCode)PCodes[bufcodeaddr]; pc.Y = bufjpc;//?? PCodes[bufcodeaddr] = pc; if (lex.Type != LexicalAnalysis.ELSE) { return; } else { i++; Code(); return; } }
/* * 符号表项目 * name * kind * value * level * addr */ //程序分析 private void MainProgram() { //<程序> := <分程序>. //先分程序后结束符 //结束符 LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; Program(); if (flag == true) { //i++; if (i >= Lexresult.Count) { flag = false; Console.WriteLine("错误:无结束符号"); errors.Add(new Error("错误:无结束符号", 0)); return; } else { lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.POINTSY && i == Lexresult.Count - 1) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 0)); codeAddr++; Console.WriteLine("分析结束"); return; } else { flag = false; Console.WriteLine("错误:结束符号.之后还有字符"); errors.Add(new Error("错误:结束符号.之后还有字符", lex.Line)); return; //Program();//这里还需要改 } } } }
//重复语句 private void RepeatCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.REPEAT) { flag = false; Console.WriteLine("Error!"); errors.Add(new Error("错误:其他错误。", 0)); return; } i++; int bufcodeaddr = codeAddr; Code(); lex = (LexicalAnalysisResult)Lexresult[i]; while (lex.Type == LexicalAnalysis.SEMISY) { i++; Code(); lex = (LexicalAnalysisResult)Lexresult[i]; } if (lex.Type != LexicalAnalysis.UNTILSY) { flag = false; Console.WriteLine("错误:此处应为until或;"); errors.Add(new Error("错误:此处应为until或;", lex.Line)); return; } i++; Condition(); PCodes.Add(new PCode(codeAddr, PCode.JPC, 0, codeAddr + 2)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, bufcodeaddr)); codeAddr++; return; }
//条件 private void Condition() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.ODDSY) { i++; ExpressionCode(); //PCODE //odd<表达式> //表达式如何odd的问题 PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 6));//ODD return; } else { ExpressionCode(); lex = (LexicalAnalysisResult)Lexresult[i]; //关系运算符 bool flag_type = false; flag_type |= (lex.Type != LexicalAnalysis.LESSSY); flag_type |= (lex.Type != LexicalAnalysis.MORESY); flag_type |= (lex.Type != LexicalAnalysis.NOTMORE); flag_type |= (lex.Type != LexicalAnalysis.NOTLESS); flag_type |= (lex.Type != LexicalAnalysis.NOTEQUALSY); flag_type |= (lex.Type != LexicalAnalysis.EQUSY); if (flag == false || flag_type == false) { flag = false; Console.WriteLine("Error!"); errors.Add(new Error("错误:此处应为关系运算符。", lex.Line)); return; } i++; ExpressionCode(); //P-CODE 写什么条件 if (lex.Type == LexicalAnalysis.LESSSY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 10));//LSS codeAddr++; } else if (lex.Type == LexicalAnalysis.MORESY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 12));//GTR codeAddr++; } else if (lex.Type == LexicalAnalysis.NOTMORE) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 13));//LEQ codeAddr++; } else if (lex.Type == LexicalAnalysis.NOTLESS) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 11));//GEQ codeAddr++; } else if (lex.Type == LexicalAnalysis.NOTEQUALSY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 9));//NEQ codeAddr++; } else if (lex.Type == LexicalAnalysis.EQUSY) { PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 8));//EQL codeAddr++; } return; } }
//因子 private void Factor() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.IDSY) { //检查标识符存不存在 //没检查同层但是不同过程的相关声明,需要在符号表栈中标记 int preloc = -1; for (int ind = symbols.Count - 1; ind >= 0; ind--) { Symbols tempsym = (Symbols)symbols[ind]; if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level) { preloc = ind; break; } } if (preloc == -1) { flag = false; Console.WriteLine("错误:不存在符号{0}", lex.Content); String msg = "错误:不存在符号" + lex.Content; errors.Add(new Error(msg, lex.Line)); return; } //PCODE 标识符相关 PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; Symbols sym_t = (Symbols)symbols[preloc]; int sym_lev = sym_t.Level; PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym_lev, sym_t.Addr)); codeAddr++; i++; return; } else if (lex.Type == LexicalAnalysis.INTSY) { int Num = Convert.ToInt32(lex.Content); //PCODE 数字相关 PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Num)); codeAddr++; i++; return; } else if (lex.Type == LexicalAnalysis.LPARSY) { i++; ExpressionCode(); //i++ lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.RPARSY) { flag = false; Console.WriteLine("错误:此处应为 ( "); errors.Add(new Error("错误:此处应为 ( ", lex.Line)); return; } else { //P-CODE i++; return; } } else { flag = false; Console.WriteLine("错误:缺少标识符、数字或("); errors.Add(new Error("错误:缺少标识符、数字或(", lex.Line)); return; } }
//写语句 private void WriteCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.WRITESY) { flag = false; Console.WriteLine("Error!"); errors.Add(new Error("错误:其他错误。", 0)); return; } i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.LPARSY) { flag = false; Console.WriteLine("错误:此处应为("); errors.Add(new Error("错误:此处应补充(", lex.Line)); return; } i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.IDSY) { //PCODE? //检查符号表 int preloc = -1; for (int ind = symbols.Count - 1; ind >= 0; ind--) { Symbols tempsym = (Symbols)symbols[ind]; if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level) { preloc = ind; break; } } if (preloc == -1) { flag = false; Console.WriteLine("错误:不存在符号{0}", lex.Content); errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line)); return; } Symbols sym = (Symbols)symbols[preloc]; PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym.Level, sym.Addr)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0)); codeAddr++; i++; } else if (lex.Type == LexicalAnalysis.INTSY) { PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Convert.ToInt32(lex.Content))); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0)); codeAddr++; i++; } else { flag = false; Console.WriteLine("无标识符"); errors.Add(new Error("错误:无标识符", lex.Line)); return; } lex = (LexicalAnalysisResult)Lexresult[i]; while (lex.Type == LexicalAnalysis.COMMASY) { i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.IDSY) { //PCODE? //检查符号表 int preloc = -1; for (int ind = symbols.Count - 1; ind >= 0; ind--) { Symbols tempsym = (Symbols)symbols[ind]; if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level) { preloc = ind; break; } } if (preloc == -1) { flag = false; Console.WriteLine("错误:不存在符号{0}", lex.Content); errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line)); return; } Symbols sym = (Symbols)symbols[preloc]; PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym.Level, sym.Addr)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0)); codeAddr++; //i++; } else if (lex.Type == LexicalAnalysis.INTSY) { PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.LIT, 0, Convert.ToInt32(lex.Content))); codeAddr++; PCodes.Add(new PCode(codeAddr, PCode.WRT, 0, 0)); codeAddr++; } else { flag = false; Console.WriteLine("无标识符"); errors.Add(new Error("错误:无标识符", lex.Line)); return; } i++; lex = (LexicalAnalysisResult)Lexresult[i]; } if (lex.Type != LexicalAnalysis.RPARSY) { flag = false; Console.WriteLine("错误:此处应为)"); errors.Add(new Error("错误:此处应补充)", lex.Line)); return; } else { i++; return; } }
//赋值语句 private void AssignCode() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.IDSY) { flag = false; Console.WriteLine("错误:赋值语句无标识符"); errors.Add(new Error("错误:其他错误", lex.Line)); return; } //符号表检查 int preloc = -1; //之前的同一层符号表还没有检查 for (int ind = symbols.Count - 1; ind >= 0; ind--) { Symbols tempsym = (Symbols)symbols[ind]; if (lex.Content.Equals(tempsym.Name) && level >= tempsym.Level) { preloc = ind; break; } } if (preloc == -1) { flag = false; Console.WriteLine("错误:不存在符号{0}", lex.Content); errors.Add(new Error("错误:不存在符号" + lex.Content, lex.Line)); return; } //PCODE 标识符相关 PCodes.Add(new PCode(codeAddr, PCode.INT, 0, 1)); codeAddr++; Symbols sym_t = (Symbols)symbols[preloc]; int sym_lev = sym_t.Level; PCodes.Add(new PCode(codeAddr, PCode.LOD, level - sym_lev, sym_t.Addr)); codeAddr++; //表达式检查 i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.ASSIGNSY) { flag = false; Console.WriteLine("错误:此处应为赋值符号"); errors.Add(new Error("错误:应为赋值符号 :=", lex.Line)); return; } i++; //进入表达式判断 ExpressionCode(); if (flag == true) { //PCODE PCodes.Add(new PCode(codeAddr, PCode.STO, level - sym_lev, sym_t.Addr)); codeAddr++; return; } else { Console.WriteLine("Error!"); errors.Add(new Error("错误:其他错误。", 0)); return; } }
//常量说明部分 private void ConstIndicate() { if (i >= Lexresult.Count) { flag = false; Console.WriteLine("错误:程序没有语句!"); errors.Add(new Error("错误:程序没有语句。", 0)); return; } LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; //常量定义 if (lex.Type != LexicalAnalysis.IDSY) { flag = false; Console.WriteLine("错误:常量const后无标识符"); errors.Add(new Error("错误:常量const后无标识符", lex.Line)); return; } else { Symbols sym = new Symbols(); sym.Type = (int)Symbols.SymTypes.CONST; sym.Level = 0; sym.Addr = 0; sym.Name = lex.Content; //addr[level]++; i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.EQUSY) { flag = false; Console.WriteLine("错误:const标识符后无=符号"); errors.Add(new Error("错误:const标识符后无=符号", lex.Line)); return; } i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.INTSY) { flag = false; Console.WriteLine("错误:常量标识符赋值应为无符号整数"); errors.Add(new Error("错误:常量标识符赋值应为无符号整数", lex.Line)); return; } if (Convert.ToInt64(lex.Content) > Convert.ToInt64(Int32.MaxValue)) { flag = false; Console.WriteLine("错误:整数太大"); errors.Add(new Error("错误:整数太大", lex.Line)); return; } sym.Value = Convert.ToInt32(lex.Content); for (int i = symbols.Count - 1; i >= 0; i--) { Symbols tempsym = (Symbols)symbols[i]; if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level) { flag = false; Console.WriteLine("错误:符号表已存在标识符" + sym.Name); errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line)); return; } } symbols.Add(sym); //递归子程序或结束 i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.SEMISY) { i++; return; } else if (lex.Type == LexicalAnalysis.COMMASY) { i++; ConstIndicate(); } else { flag = false; Console.WriteLine("错误:符号应为 , 或 ;"); errors.Add(new Error("错误:符号应为 , 或 ;", lex.Line)); return; } } }
//过程说明部分 private void ProcIndicate() { //JMP 0 主程序入口 PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, 0)); int bufcodeaddr = codeAddr; //JMP此处的0表示待定 codeAddr++; LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; //标识符 if (lex.Type != LexicalAnalysis.IDSY) { flag = false; Console.WriteLine("错误:procedure后应为标识符"); errors.Add(new Error("错误:procedure后应为标识符", lex.Line)); return; } Symbols sym = new Symbols(); sym.Name = lex.Content; sym.Type = (int)Symbols.SymTypes.PROC; sym.Level = level; sym.Value = codeAddr + 1; sym.Addr = addr[level]; addr[level]++; //; PCodes.Add(new PCode(codeAddr, PCode.JMP, 0, codeAddr + 1)); codeAddr++; i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.SEMISY) { flag = false; Console.WriteLine("缺少 ;"); errors.Add(new Error("错误:缺少 ;", lex.Line)); return; } for (int i = symbols.Count - 1; i >= 0; i--) { Symbols tempsym = (Symbols)symbols[i]; if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level) { flag = false; Console.WriteLine("错误:符号表已存在标识符" + sym.Name); errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line)); return; } } symbols.Add(sym); i++; level++; if (level > 10) { flag = false; errors.Add(new Error("错误:分程序层次过多", lex.Line)); return; } Program(); //符号表删除 int cnt = symbols.Count - 1; for (int i = cnt; i >= 0; i--) { Symbols sym_prerem = (Symbols)symbols[i]; if (sym_prerem.Level == level) { symbols.RemoveAt(i); } } level--; //i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.SEMISY) { flag = false; Console.WriteLine("缺少 ;"); errors.Add(new Error("错误:缺少 ;", lex.Line)); return; } i++; PCode pc = (PCode)PCodes[bufcodeaddr]; pc.Y = codeAddr; PCodes.Add(new PCode(codeAddr, PCode.OPR, 0, 0)); codeAddr++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.PROCEDURE) { i++; ProcIndicate(); } else { //i++; return; } }
//变量说明部分 private void VarIndicate() { LexicalAnalysisResult lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type != LexicalAnalysis.IDSY) { flag = false; Console.WriteLine("错误:var后面应为标识符"); errors.Add(new Error("错误:var后面应为标识符", lex.Line)); return; } Symbols sym = new Symbols(); sym.Type = (int)Symbols.SymTypes.VAR; sym.Name = lex.Content; sym.Level = level; sym.Addr = addr[level]; addr[level]++; i++; lex = (LexicalAnalysisResult)Lexresult[i]; if (lex.Type == LexicalAnalysis.COMMASY) { for (int i = symbols.Count - 1; i >= 0; i--) { Symbols tempsym = (Symbols)symbols[i]; if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level) { flag = false; Console.WriteLine("错误:符号表已存在标识符" + sym.Name); errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line)); return; } } symbols.Add(sym); i++; VarIndicate(); } else if (lex.Type == LexicalAnalysis.SEMISY) { for (int i = symbols.Count - 1; i >= 0; i--) { Symbols tempsym = (Symbols)symbols[i]; if (tempsym.Name.Equals(sym.Name) && level == tempsym.Level) { flag = false; Console.WriteLine("错误:符号表已存在标识符" + sym.Name); errors.Add(new Error("错误:符号表已存在标识符" + sym.Name, lex.Line)); return; } } symbols.Add(sym); i++; return; } else { flag = false; Console.WriteLine("错误:符号应为 , 或 ;"); errors.Add(new Error("错误:符号应为 , 或 ;", lex.Line)); return; } }