⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analyser.cs

📁 这个东西是我使用c#语言写的c--词法分析器
💻 CS
📖 第 1 页 / 共 2 页
字号:
                        cToken.setCmm(LPAREN);
                        cChar += (char)c;
                        break;
                    case ')':
                        cToken.setCmm(RPAREN);
                        cChar += (char)c;
                        break;
                    case '{':
                        cToken.setCmm(LBRACE);
                        cChar += (char)c;
                        break;
                    case '}':
                        cToken.setCmm(RBRACE);
                        cChar += (char)c;
                        break;
                    case ';':
                        cToken.setCmm(SymbolI);
                        cChar += (char)c;
                        break;
                    case ',':
                        cToken.setCmm(COMMA);
                        cChar += (char)c;
                        break;
                    case '[':
                        cToken.setCmm(LMIDPAREN);
                        cChar += (char)c;
                        break;
                    case ']':
                        cToken.setCmm(RMIDPAREN);
                        cChar += (char)c;
                        break;
                    default:
                        //处理错误
                        cToken.setCmm(ERROR);
                        cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
                        errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                        break;
                }
            }
        }

        
        // 查询一个标识符是否为保留字类,如果是则返回类型该保留字的类型,否则返回ID类型
        
        protected int reservedCheck(String reserved)
        {
            for (int i = 0; i < keyWord.Length; i++)
            {
                if (keyWord[i].getName().Equals(reserved))
                    return keyWord[i].getCmmType();
            }
            return ID;
        }

        
        // 处理并识别赋值
        
        protected void processAssignState()
        {
            unGetNextChar();
            int c = getNextChar();
            if (c == '=')
            {
                cChar += (char)c;
                cToken.setCmm(ASSIGN);
            }
            else
            {
                //处理错误
                cToken.setCmm(ERROR);
                cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
                errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                unGetNextChar();
            }
        }
        protected void processCharState()
        {
            int c = getNextChar();
            if (isLetterOrDigit(c))
            {
                int c1 = getNextChar();
                if (c1 == '\'')
                {
                    cToken.setCmm(CHARC);
                    cChar += (char)c;
                    cChar += (char)c1;
                }
                else
                {
                    unGetNextChar();
                    unGetNextChar();
                    //处理错误
                    cToken.setCmm(ERROR);
                    cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
                    errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                }
            }
            else
            {
                unGetNextChar();
                //处理错误
                cToken.setCmm(ERROR);
                cChar += "The " + linePos + " Character '" + (char)c + "' is error !";
                errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
            }
        }

        
         // 处理并识别标识符ID单词,只能以字母开头,不能以"_"结尾。
         
        protected void processIDState()
        {
            int c = getNextChar();
            //int var = 0;
            while (isLetterOrDigit(c) || c == '_')
            {
                cChar += (char)c;
                c = getNextChar();
            }
            if (cChar[cChar.Length - 1] == '_')
            {
                cToken.setCmm(ERROR);
                errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
                unGetNextChar();
            }
            else
            {
                unGetNextChar();
                cToken.setCmm(ID);
            }
        }
        
         // 处理并识别数字number串
         
        public void processNumState()
        {
            unGetNextChar();
            int c = getNextChar();
            int dotNum = 0;
            while (isLetterOrDigit(c) || c == '.')
            {
                if (isDigit(c))
                {
                    cChar += (char)c;
                    c = getNextChar();
                    cToken.setCmm(NUM);
                }
                else if (isLetter(c))
                {
                    while (isLetterOrDigit(c))
                    {
                        cChar += (char)c;
                        c = getNextChar();
                    }
                    cToken.setCmm(ERROR);
                    errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                    cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
                    unGetNextChar();
                }
                else
                {
                    c = (char)c;
                    cChar += (char)c;
                    c = getNextChar();
                }
            }//while 结束
            for (int var = 0; var < cChar.Length; var++)
            {
                if (cChar[var] == '.')
                    dotNum++;
            }
            if (dotNum <= 1)
            {
                cToken.setCmm(NUM);
            }
            else
            {
                cToken.setCmm(ERROR);
                errorList.addError(new Error("Unexpected charactor: "
                          + (char)c, lineNum));
                cChar = (linePos - 1) + "个字符: '" + cChar + "' 错误!";
                unGetNextChar();
            }
        }
        
          //产生词法分析的Token序列
         
        public void genTokenList()
        {
            Tokenizer token = scan();
            while (token.getCmm() != ENDFILE)
            {
                tokenList.Enqueue(token);
                token = scan();
            }
            tokenList.Enqueue(token);
        }

        public Queue<int> getErrorLines()
        {
            return errorLines;
        }
        
        // 打印错误信息
        
        private void printErrorInfo()
        {
            //产生词法分析的Token序列
            genTokenList();
            int errorNum = errorList.getErrorNum(), flag = 0;
            if (errorNum == 0)
                output += "分析成功,没有错误 !\n" + "开始 :\n";
            else
            {
                if (errorNum == 1)
                    output += "源代码中共有一个错误 :\n" + "开始:\n";
                else
                    output += "分析成功共有 :" + errorNum + " 错误:\n" + "开始:\n";

            }
        }
        
         // 打印token序列
         
        public string printTokenList()
        {
            //调用错误处理和Token序列产生函数
            printErrorInfo();
            //获得Token序列项数
            int count = tokenList.Count;
            //遍历tokenList
            for (int i = 0; i < count; i++)
            {
                Tokenizer cToken = tokenList.Dequeue();
                output += cToken.getLineNum() + ": ";
                switch (cToken.getCmm())
                {
                    case ASSIGN:
                        output += "等价符——>" + cToken.getSymbol() + "\n";
                        break;
                    case EQ:
                    case LT:
                    case GT:
                    case PLUS:
                    case MINUS:
                    case TIMES:
                    case OVER:
                        output += "运算符——>" + cToken.getSymbol() + "\n";
                        break;
                    case LPAREN:
                    case RPAREN:
                    case LBRACE:
                    case RBRACE:
                    case DOT:
                    case COMMA:
                    case SymbolI:
                    case LMIDPAREN:
                    case RMIDPAREN:
                    case UNDERANGE:
                        output += "分界符——>" + cToken.getSymbol() + "\n";
                        break;
                    case LCOMMENT:
                        output += "注释符——> /*" + cToken.getSymbol() + "\n";
                        break;
                    case RCOMMENT:
                        output += "注释符——>*/" + cToken.getSymbol() + "\n";
                        break;
                    case ID:
                        output += "标识符——> " + cToken.getSymbol() + "\n";
                        break;
                    case NUM:
                        output += "实数——> " + cToken.getSymbol() + "\n";
                        break;
                    case ENDFILE:
                        output += "结束\n";
                        break;
                    case ERROR:
                        output += "EORR: " + cToken.getSymbol() + "\n";
                        break;
                    default:
                        output += "保留字——> " + cToken.getSymbol() + "\n";
                        break;
                }
            }
            return output;
        }           
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -