//条件语句 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; } }
public void Analysis() { MainProgram(); if (flag == true) { string file = "pcode.txt"; StreamWriter wr = new StreamWriter(new FileStream(file, FileMode.Create, FileAccess.Write)); for (int i = 0; i < PCodes.Count; i++) { PCode pc = (PCode)PCodes[i]; wr.WriteLine(pc.PrintPCode()); wr.Flush(); } wr.Close(); String name = System.IO.Directory.GetCurrentDirectory(); Console.WriteLine(name); Form1.ShowError("生成的P-Code文件已保存到\n" + name + "\\pcode.txt", 0); } else { Error err = (Error)errors[0]; err.ErrorMsgSend(); } }
//过程说明部分 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; } }