//因子 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 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 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; } }
//常量说明部分 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 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; } }