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

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

Input

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

Output

 假链跳到0,真链跳到1,表达式序号从100开始排。

Sample

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)
#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);//or\end情况 真--跳转
            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);
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来杯Sherry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值