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

📄 text5.cpp

📁 编译原理-实现赋值语句的四元式的程序
💻 CPP
字号:
#include <iostream>
#include <cstdlib>
#include <string>
#include <stack>

using namespace std;

//栈内符号优先级
int is(const char c)
{
switch(c)
{
case '(': return 0;
case '+': return 2;
case '-': return 2;
case '*': return 4;
case '/': return 4;
case ')': return 5;
default: return -1;
}
}

//栈外符号优先级
int os(const char c)
{
switch(c)
{
case '(': return 6;
case '+': return 1;
case '-': return 1;
case '*': return 3;
case '/': return 3;
case ')': return 0;
default: return -1;
}
}

//四元式翻译
int translate1(string s)
{
stack<string> OPND;
stack<char> OPER;
char op;
string left, right;
int step = 0;
char sChange[10];
string sTemp;

cout << "转换成四元式:" << endl;

for (int i=0; i<(int)s.length(); i++)
{
   if ( (s[i]>='0' && s[i]<='9') || (s[i]>='a' && s[i]<='z') )
   {
    sTemp = "";
    sTemp += s[i];
    OPND.push(sTemp);
   }
   else
   {
    while (!OPER.empty() && os(s[i])<is(OPER.top()))
    {
     right = OPND.top();
     OPND.pop();
     left = OPND.top();
     OPND.pop();
     op = OPER.top();
     OPER.pop();
     cout << "(" << step << ")   ";
     step++;
     sTemp = _itoa(step, sChange, 10);
     sTemp = "T" + sTemp;
     OPND.push(sTemp);
     cout << op << "   " << left << "   " << right << "   " << sTemp << endl;
    }
    if(!OPER.empty() && os(s[i])==is(OPER.top()))
     OPER.pop();
    else
     OPER.push(s[i]);
   }
}
while (!OPER.empty())
{
   right = OPND.top();
   OPND.pop();
   left = OPND.top();
   OPND.pop();
   op = OPER.top();
   OPER.pop();
   cout << "(" << step << ")   ";
   step++;
   sTemp = _itoa(step, sChange, 10);
   sTemp = "T" + sTemp;
   OPND.push(sTemp);
   cout << op << "   " << left << "   " << right << "   " << sTemp << endl;
}
return 0;
}

int main()
{
string s;
while (true)
{
   cout << "请输入一个算术表达式:" << endl;
   cin >> s;
   translate1(s);
   cout << endl;
  }
return 0;
}

⌨️ 快捷键说明

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