[编译原理]7-4 翻译布尔表达式-A

软件设计师之编译原理:语法制导翻译与代码生成实战 在软件设计领域,编译原理中的语法制导翻译和代码生成是将高级语言程序转化为可执行代码的关键环节。我写这篇博客,旨在和大家一起学习进步,深入剖析这些复杂知识,用通俗易懂的方式讲解,并结合Java代码示例和图表辅助理解,助力大家在软件设计之路上稳步前行。 阅读详情

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

注意,在布尔表达式中,“并且”运算的优先级是要高于“或者”运算的。

输入格式:

输入为一行字符串,例如: a < b or c < d and e < f

每个符号都用空格间隔。

其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。

输出格式:

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

输入样例1:

a < b or c < d and e < f

输出样例1:

100(j<,a,b,1)
101(j,_,_,102)
102(j<,c,d,104)
103(j,_,_,0)
104(j<,e,f,100)
105(j,_,_,103)

输入样例2:

a < b and c > d or e > f

输出样例2:

100(j<,a,b,102)
101(j,_,_,104)
102(j>,c,d,1)
103(j,_,_,101)
104(j>,e,f,100)
105(j,_,_,0)
#include<bits/stdc++.h>
using namespace std;
vector <string> ans;
string s;
int main(){

        getline(cin,s);
        s+=" end";
        string x;
        int t =1,f=100;
        stringstream ss(s);
        int id =100;
        while(ss>>x){
            if(x == "or"||x=="end"){
                if(x=="or") f+=2;
                else f=0;
                int i;
                int n = ans.size();
                for(i=0;i<n-3;i+=3){
                printf("%d(j%s,%s,%s,%d)\n",id,ans[i+1].c_str(),ans[i+0].c_str(),ans[i+2].c_str(),id+2);
                id++;
                printf("%d(j,_,_,%d)\n",id,f);
                f =id++;
            }
                printf("%d(j%s,%s,%s,%d)\n",id,ans[i+1].c_str(),ans[i].c_str(),ans[i+2].c_str(),t);
                t = id -(n-3)/3*2;
                id++;
                printf("%d(j,_,_,%d)\n",id,f);
                id++;
                ans.clear();
                if(x=="end")break;
            }

            else if(x == "and") f+=2;
            else
                ans.push_back(x);
            }
    }
程序功能:布尔表达式翻译成四元式 #include #include #include #include using namespace std; //and or not true false( ) i rop # int action[18][10]={ { 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 阅读详情

相关推荐

sdut—编译原理机测代码题(共4次)

对于给定的输入串(长度不超过50个符号),请输出分析过程中用到的所有产生式,并指明该输入串是否为该文法能生成的表达式,输出共11行,前10行每行两个数据用空格隔开,表示推导时所用产生式顺序号(从0开始),最后一行是accept,表示i+i*i是文法能生成的合法表达式。7. < if语句>→< if关键字>()|()< else关键字>)15. →+|-|

m0_61840575的博客 1398

翻译布尔表达式

Problem Description 大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。 Input 输入为一行字符串,例如: a < b or c < d and e < f 每个符号都用空格间隔。 其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。 Output 假...

DuChunfeng的博客 880

SDUT OJ 编译原理

编译原理oj实验

qq_62846665的博客 3206

N - 翻译布尔表达式 SDUT C++

目录 代码: 分析: 代码实现思路: ☆错误ERROR: 代码: #include <bits/stdc++.h> using namespace std; vector <string> ans; //ans中存放的是每个只含and的子bool表达式,在下面分析中有详细说明,这里的判断符长度可能不同,所以用vector与string组合数据结构的正好。 int main() { string boolStr, str; getline(cin, boolSt..

zhangzhaolin12的博客 2949

编译原理中间代码生成:四元式、DAG与布尔表达式短路计算详解

中间代码生成是编译原理的核心环节,它负责将高级语言程序转换为一种介于源代码和目标代码之间的中间表示形式。其核心原理在于设计一种既独立于具体机器架构,又能清晰表达程序语义的表示方法,从而为后续的代码优化和目标代码生成奠定基础。这项技术的核心价值在于实现了编译器的模块化与可移植性,并极大地便利了多种代码优化算法的实施。在工程实践中,中间代码被广泛应用于各类编译器前端,如GCC、LLVM等。常见的中间表示形式包括四元式、三元式和有向无环图(DAG)。其中,四元式结构清晰,易于生成目标代码;DAG则能有效识别并消除

weixin_29587015的博客 290

Unity动画状态机实战:Trigger和Bool参数到底怎么选?附5个常见场景解析

本文深入解析Unity动画状态机中Trigger和Bool参数的核心差异与应用场景。通过对比两者在描述瞬时事件与持续状态上的本质区别,并结合角色移动、攻击连招、跳跃落地、受击死亡及环境交互等5个实战场景,提供了清晰的选择逻辑与避坑指南,帮助开发者构建更健壮、易维护的动画逻辑。

weixin_29009501的博客 120

编译原理|第7章|布尔表达式的翻译

数值表示法 如同计算算数表达式一样,一步步计算(先算括号,后外面) 例子: a or b and not c 翻译成: T1=not c T2=b and T1 T3=a and T2 ...

a1512329942的博客 1万+

基于555定时器的呼吸灯电路

呼吸灯是指LED灯在芯片的控制下完成由亮到暗的逐渐变化,感觉就像人在呼吸,其广泛使用在手机上,起到一个通知提醒的作用。呼吸灯在许多灯光装饰上也有大量使用,如音响、汽车广告牌等,在生活中较为常见。...

qq1074237849的博客 9492

布尔表达式的LR翻译器

布尔表达式的LR翻译器 1引言 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 所谓LR(K)分析,是指从左至右扫描和

销魂的猫 8119

C# chart以鼠标所在位置为中心进行缩放

以前都用labview做一些软件,但给出去总是会遇到版本,安装包过大等一些问题,于是想自学C#,记录一下使用过程中遇到的一些问题和解决措施,便于日后回顾。 在这个项目中需要绘制折线图,由于数据比较大,需要对图表进行缩放操作,以鼠标为中心对图表进行缩放,在网上查找了一些资料没找到我想要的,于是自己想了一个解决方案,可以基本实现,但略显繁琐,由于刚开始学习C#,对一些操作不太了解,若以后遇...

fei的博客 6363

蓝牙Channel Sounding为真正的距离感知赋能

1:工作原理蓝牙™信道探测使用两种经过验证的测距方法——PBR(PBR)和RTT(RTT),实现蓝牙设备之间的安全精密测距。

weixin_43720159的博客 807

六万字长文!让你懂透编译原理(七)——第七章 语义分析和中间代码产生

近万字长文!让你懂透编译原理(七)——第七章 语义分析和中间代码产生 E→E1op E2 E是由两个子表达式通过op运算符连接而成 E.code:= E1.code || E2.code ||op 那么他的语义说的是,构造好的复杂的表达式后缀形式由op前面的子表达式E1的后缀形式和op后面的子表达式E2的后缀形式这两个后缀形式依次连接,再放上op运算符,这样的出来的就是整个表达式的后缀形式。 (E的后缀式是E1的后缀式+E2的后缀式+op) E→ (E1) 第二条规则,从语法上看,一个表达

小哨的博客 8326

地统计插值学习心得(一)

(创建地统计图层工具用于根据现有的地统计图层或者地统计模型来创建包含新要素数据集的地统计图层,也就是使用构建好的地统计模型用到新的数据集中)这表明,远离极值的区域预测不受极值的影响,并且还表明,包括极值会导致钼元素浓度高的区域周围的预测明显变高。通常,我们使用同一个数据集进行建模和预测,但是在实际插值过程中,这两步的数据可以是不同的,这就是处理极值的诀窍。如果你的数据集有无法忽略的极值时(比如这些钼元素浓度),一种常见的方法是首先显式移除极值进行建模,然后在预测中使用整个数据集(包括极值)。

JData_Engineer的博客 286

【编译原理系列】布尔表达式及控制语句翻译

布尔表达式 从高到低:not and or 短路计算可以回避指针为空时对ptr^.data=x的判断,从而 直接计算的语法制导翻译 (1)E→E1 or E2 { E.place := newtemp; emit(E.place ':=' E1.place 'or' E2.place);} (2) |E1 and E2 { E.place := newtemp; emit(E.place ':=' E1.place 'and' E2.place);} (3) |not E1

菜鸡也有大佬梦 5206

SFT看这一篇就够了!万字长文:监督微调(Supervised Fine-Tuning, SFT)技术全解析【从理论到实战】

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。欢迎关注,一起探索技术的无限可能!

大F子的智能小课 712

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB使用贝叶斯bnt网络工具箱:使用手册详解

WW、forever的博客 2676

编译原理7~9

编译原理

zhengzhiyu__的博客 1991

基于STM32L4XX 、HAL库的DRV8311三相无刷直流电机(BLDC)驱动应用C语言程序设计

是德州仪器(TI)推出的一款针对三相无刷直流(BLDC)电机或永磁同步电机(PMSM)的集成驱动器芯片。:集成了三个半桥MOSFET、门极驱动电路、电荷泵(支持100%占空比)、稳压器以及多种保护电路。:工作电压最高可达,持续输出电流可达,峰值电流可达。:通过引脚直接控制每个半桥的PWM和使能。这种方式需要MCU输出6路信号,控制更灵活。:通过SPI总线配置内部寄存器,仅需PWMA/B/C三路PWM信号即可控制电机。可以读取故障状态、配置参数(如死区时间、电流保护阈值等),是更常用和推荐的方式。

PP_Cottage的博客 553

编译原理陈火旺第三版第七章课后题答案

编译原理陈火旺第三版第七章课后题答案

capture3333的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SDUTACM M - 翻译布尔表达式

M - 翻译布尔表达式 Description 大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。 Input 输入为一行字符串,例如: a < b or c < d and e < f 每个符号都用空格间隔。 其中逻辑运算符包含 and 和 or , 关系运算符包含 < 、> 、<= 、 >= 、== 、 != 。 Output 假链跳到0,真链跳到1,表达式序号从100开始排。 能AC的代码 #include <bits/st

qq_45824029的博客 1244

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SDUT编译原理课程实验

TitleStatsA小C语言--词法分析程序B识别浮点常量问题C小型Basic编译器问题D表达式语法分析——递归子程序法E表达式语法分析——预测分析法F算符优先分析G算符优先系列之(一)Firstvt和Lastvt集H算符优先系列之(二)算符优先关系表I算符优先系列之(三)输入串分析JLL(1)文法系列(一)first集和follow集KLL(1)文法系列(三)预测分析程序LLL(1)文法系列(二)预测分析表MLR(1)文法N翻译布尔表达式ODAG优化P简单的代码生成程序小C语言文法 1. <程序>→<

m0_73819718的博客 2403

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第七章 总结及作业(137)【编译原理】

第七章 总结及作业【编译原理】

小心星的博客 2568

【编译原理】编译原理知识点汇总·属性文法和语法制导翻译

为什么打算开始这一系列的文章——编译原理🎄🎄其实本学期开始就一直想持续更新,陆陆续续主要更新了实验部分。正好趁着快要考试,便和大家一起花费几天的时间回顾编译原理的知识点。目前,祝大家都能取得好成绩呀~~🥰🥰英文名:Compilers: Principles,Techniques,and Tools (龙书)🦖作者:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman1.本课程介绍编译器构造的一般原理和基本实现方法,

十二月的猫 2433
上一篇: [编译原理]PTA复习笔记
下一篇: Django框架安装启动入门
ArtinCode
博客等级 码龄9年 23粉丝 49原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值