/// <summary> /// 获取词法分析表 /// </summary> /// <returns></returns> private static LexTbl getLexTbl() { string filePath = "lextbl.inf";//词法分析表配置文件路径 LexTbl lexTbl = new LexTbl(); try { using (StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("gb2312"))) { string line = ""; while ((line = sr.ReadLine()) != null) { line = line.Trim(); string[] statusStr = line.Split('\t'); int[] statusInt = new int[statusStr.Length]; for (int i = 0; i != statusStr.Length; i++) { statusInt[i] = Convert.ToInt32(statusStr[i]); } lexTbl.AddNewLine(statusInt); } } } catch (System.IO.FileNotFoundException e) { int stage = 1; throw (new MIPS246.Compiler.ErrorHandling.FileNotFoundException(filePath, stage, e)); } return(lexTbl); }
/// <summary> /// 生成token串 /// </summary> /// <param name="contentList">源代码</param> /// <param name="lexTbl">词法转换表</param> /// <returns></returns> private static List <Token> genTokenList(List <string> contentList, LexTbl lexTbl) { List <Token> tokenList = new List <Token>(); int lineNo = 1; foreach (string line in contentList) { if ((line == "") || line.StartsWith("#")) //忽略空行和#行 { lineNo++; continue; } else { char[] lineCharArray = line.ToCharArray(); int nextPos = 0; //指向源代码中下一个待处理的字符 int curStatus = 1; //当前状态 int nextStatus = 0; //根据当前状态和下一个待处理字符得出的下一个状态 string buffer = ""; //存储识别的单词 while (nextPos != lineCharArray.Length) { if (!SystemWord.AcceptableCharList.Contains(lineCharArray[nextPos])) //遇到不能识别的字符 { throw (new UnknowCharExcpetion(lineCharArray[nextPos], lineNo, new Exception())); } nextStatus = lexTbl.getNextStatus(curStatus, lineCharArray[nextPos]); if (nextStatus == 1) //空格 { nextPos++; } else if (nextStatus < 0) //识别了一个单词 { processWord(buffer, lineNo, nextStatus, tokenList); curStatus = 1; buffer = ""; } else if (nextStatus > 1) //读入下一个字符 { buffer += lineCharArray[nextPos].ToString(); curStatus = nextStatus; nextPos++; } else //未能识别的单词 { buffer += lineCharArray[nextPos].ToString(); throw (new UnknowWordExcpetion(buffer, lineNo, new Exception())); } } } lineNo++; } return(tokenList); }