示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }