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

📄 zyh.cpp

📁 程序—词法分析。用于分析PASCAL源程序
💻 CPP
字号:
    // 1. suppose we have only + , - , * , / ;  and +, - will not be the first one
    // 2. suppose the number is only 0,1,...,8,9 ( one digit )
    // 3. suppose the expression is not very long
    #pragma warning(disable:4786)
    
    #include 
    #include 
    #include 
    
    using namespace std;
    vector<char> gOperatorStack;
    vector<int> gDigitStack;
    vector<string> gPartialExpression;
    
   bool isOperatorPrecedent(char op1,char op2)
    {
            return (op1=='*'||op1=='/'||op2=='+'||op2=='-');
    }
    
    string expressionFromExpression(string expression)
    {
            string digits[]={"0","1","2","3","4","5","6","7","8","9",""};
            gOperatorStack.clear();
            gDigitStack.clear();
            gPartialExpression.clear();
            gPartialExpression.assign(digits,digits+sizeof(digits)/sizeof(digits[0]));
            // not using iterator, don't make beginner fear
            for(int i=0;isize();++i)
            {
                    if(expression[i]>='0'&&expression[i]<='9')
                           gDigitStack.push_back(expression[i]-'0');
                    else
                    {
                            while(gOperatorStack.size()&&isOperatorPrecedent(
                                    gOperatorStack[gOperatorStack.size()-1],expression[i]))
                            {
                                    string s;
                                    s+=gOperatorStack[gOperatorStack.size()-1];
                                    s+=gPartialExpression[gDigitStack[gDigitStack.size()-2]];
                                    s+=gPartialExpression[gDigitStack[gDigitStack.size()-1]];
                                    gPartialExpression.push_back(s);
                                    gDigitStack.pop_back();
                                    gDigitStack.pop_back();
                                    gDigitStack.push_back(gPartialExpression.size()-1);
                            }
                            gOperatorStack.push_back(expression[i]);
                    }
            }
            while(gOperatorStack.size())
            {
                    string s;
                    s+=gOperatorStack[gOperatorStack.size()-1];
                    s+=gPartialExpression[gDigitStack[gDigitStack.size()-2]];
                    s+=gPartialExpression[gDigitStack[gDigitStack.size()-1]];
                    gPartialExpression.push_back(s);
                    gOperatorStack.pop_back();
                    gDigitStack.pop_back();
                   gDigitStack.pop_back();
                    gDigitStack.push_back(gPartialExpression.size()-1);
            }
            return gPartialExpression[gPartialExpression.size()-1];
    }
    
    int main(int argc, char* argv[])
    {
            char* expressions[]=
            {
                    "",
                    "1+3",
                    "1*2+3*4",
                    "1+2*3+4",
                    "1/3+4*2/5-6*7",
                    "2+4-9*3-4/6+7"
            };
            for(int i=0;i<sizeof(expressions)/sizeof(expressions[0]);++i)
            {
                    cout<"    "<endl;
            }
           return 0;
    }
    

⌨️ 快捷键说明

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