M - 翻译布尔表达式【编译原理机测】

2023-05-25 13:58:11 浏览数 (2)

M - 翻译布尔表达式 Description 大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。

Input

代码语言:javascript复制
输入为一行字符串,例如: a < b or c < d and e < f
每个符号都用空格间隔。
其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。

Output

代码语言:javascript复制
 假链跳到0,真链跳到1,表达式序号从100开始排。

Sample

代码语言:javascript复制
Input 
a < b or c < d and e < f
Output 
100(j<,a,b,1)
101(j,_,_,102)
102(j<,c,d,104)
103(j,_,_,0)
104(j<,e,f,100)
105(j,_,_,103)
代码语言:javascript复制
#include<bits/stdc  .h>
using namespace std;
vector<string>tt;
int main()
{
    int yes =1,no =100,num =100;
    string a;
    getline(cin,a);
    a  = " end";//加个终止符号          !!!end前面容易漏空格!!!
    stringstream ss(a);//a赋值给ss,
    string s;
    while(ss >> s)//ss 以空格间隔输出 字符/字符串 并赋值给s
    {
        if(s == "or" || s == "end")// 习惯写成if(s =="or"||"end")
        {
            if(s == "or")no  = 2;
            else no = 0;
            int n =tt.size();
            for (int i = 0; i < n-3; i  = 3) //除了最后三个 肯定是end情况(即最后表达式决定最终表达式整体真假),其余的都是or和and情况,在循环里解决的是and情况
            {
                printf("%d(j%s,%s,%s,%d)n",num,tt[i 1].c_str(),tt[i].c_str(),tt[i 2].c_str(),num 2);//and 真--通过 num 继续
                num  ;
                printf("%d(j,_,_,%d)n",num,no);//and 假--跳转
                no = num  ;

            }
            printf("%d(j%s,%s,%s,%d)n",num,tt[n-2].c_str(),tt[n-3].c_str(),tt[n-1].c_str(),yes);//orend情况 真--跳转
            yes = num  ;
            printf("%d(j,_,_,%d)n",num,no);//end情况 为假 --跳转 ||or情况 为假的 --通过 no 继续
            num  ;
            tt.clear();
            if(s == "end")break;//需要写终止条件


        }
        else if(s == "and")no  =2;//存一下,去or的情况下处理再一起处理
        else tt.push_back(s);
    }
}

0 人点赞