有哪些做ppt的网站有哪些/新闻 近期大事件
图源:文心一言
编译原理习题整理~🥝🥝
作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡
- 第1版:自己的解题,与AI老师的判卷~🧩🧩
编辑:梅头脑🌸
审核:文心一言
题源:龙书《编译原理》 Alfre V.Aho 等著 赵建华 等译
目录
🧵参考答案
🧵练习2.3.1
🧵练习2.3.2
🧵练习2.3.3
🧵练习2.3.4
🔚结语
🧵参考答案
🌸fool2fish (Zhouxuan Yang) 博文:dragon-book-exercise-answers - GitCode
🧵练习2.3.1
🧩题目
构建一个语法制导翻译方案,该方案把算术表达式从中缀表示方式翻译成运算符在运算分量之前的前缀表达方式。例如:-xy是表达式 x-y 的前缀表示法。给出输入 9-5+2 和 9-5*2 的注释分析树。
📇答题
- 产生式
expr → expr { ("+" | "-") term } term → factor { ("*" | "/") factor } factor → "(" expr ")" | digit digit → "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
- 语义规则
expr → {print ('+' | '-')} expr { ("+" | "-") term } term → {print ('*' | '/')} factor { ("*" | "/") factor } factor → "(" expr ")" | {print ('digit')} digit digit → "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
- 注释分析树(这个小问,好像找不到参考答案)
📇AI审核
1:我曾问过AI,它习惯将第一行写为expr → term { ("+" | "-") term },这实际与教材中书写的expr → expr { ("+" | "-") term }不同,为什么不写为后者呢?
- 第一行产生式
expr → expr { ("+" | "-") term }
,。这种表示方法采用了左递归的形式,意味着一个表达式可以是一个更复杂的表达式后跟一个由加法或减法运算符和另一个项组成的序列。- 然而,左递归形式对于某些解析技术(如自顶向下的解析器,如递归下降解析器)来说可能会导致问题,因为它们可能无法有效地处理这种直接或间接的无限递归情况。为了避免这些问题,通常会使用等价的右递归形式来重写产生式,如下所示:
expr → term { ("+" | "-") term }
- 在这个右递归版本中,
expr
以一个term
开始,后面可以跟零个或多个由加法或减法运算符和另一个term
组成的序列。这种形式更适合于自顶向下的解析算法,因为它保证了解析过程在有限的步骤内会终止。- 在您提供的原始问题中,没有特别指明必须使用左递归还是右递归形式,因此两者在描述算术表达式的语法结构时都是有效的。但是,从实现解析器的角度来看,选择右递归形式通常是更可取的做法,因为它与更广泛使用的解析算法兼容。
- 因此,即使第一行写成
expr → expr { ("+" | "-") term }
在语法上是正确的,但考虑到解析器的实现,通常更倾向于使用右递归形式expr → term { ("+" | "-") term }
。
📇知识扩展
- 树是什么鬼,先序遍历又是什么鬼:🌸数据结构05:树与二叉树[C++]-CSDN博客
- 中缀转后缀的C++代码:🌸数据结构03:栈、队列和数组-CSDN博客
🧵练习2.3.2
🧩题目
构建一个语法制导翻译方案,该方案把算术表达式从后缀表达式翻译成中缀表达式。给出输入 95-2* 和 95*2- 的注释分析树。
📇争议
- 本题解题过程可能有误,可能的争议点如下,欢迎小伙伴指导与讨论~
- 问题1:
- 按照我看书的理解,表达式可能是这样的:
- 产生式:expr → expr + term,这个用于描述中缀表达式;
- 语义规则:expr = expr.t || term.t || '+',这个用于描述后缀表达式;
- 语义动作:expr → expr + term {print('+')},这个用于将中缀表达式翻译为后缀,其中的{print('+')}除了输出‘+’号以外没有意义;
- 那么后缀表达式:
- 产生式可能是:expr → expr term + ,这个用于描述后缀表达式,这也是参考答案的写法;
- 但是AI不同意,强烈不建议这样写,在AI的理解这个语句“expr → expr term +”不能被解析器正确解析,其余理由我贴到了答案后面;
- 因此,目前还是按照中缀表达式书写的答案;虽然AI也不建议这样写,他认为没有什么作用,在真正的编译器设计中,
- 问题2:
- 除此以外:我的解法语法可能有问题,没有区分优先等级,且会非常随意地加很多括号给表达式;话说,这如果是算法题,答成这样一半分就没有了...
- 答题后贴的参考答案避免了这个问题(答案链接已贴于文首),价值相对高一些~~
📇思路
- 后缀表达式没有括号,按从左到右的顺序运算,运算符的优先级别是相等的(如果我没有记错的话),而转换为的中缀表达式可能有括号。例如执行"4 5 6 + *":
- 读到
4
,压入栈。- 读到
5
,压入栈。- 读到
6
,压入栈。此时栈中有三个操作数:4、5 和 6。- 读到
+
,弹出5
和6
,形成中缀子表达式5 + 6
,并将其作为一个整体结果(可能带有括号)暂存或输出。此时栈中应该只剩下4
。- 读到
*
,弹出4
和刚才得到的中缀子表达式5 + 6
。形成最终的中缀表达式4 * (5 + 6)
。
📇答题
- 产生式
expr → expr { operator term } term → digit digit → "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" operator → "+" | "-" | "*" | "/"
- 语义规则
expr → {print('(')} expr { operator{print('operator')} term } {print(')')} term → digit | print('digit'); digit → "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" operator → "+" | "-" | "*" | "/"
📇AI审核
1:我曾问过AI,它将后缀表达式的第一行写为expr → term { operator term },而非更符合后缀表达式形式的expr → term { term operator}呢?
- 在后缀表达式(也称为逆波兰表示法)中,操作数(项,即
term
)位于操作符之前。因此,当我们将后缀表达式转换为其他形式(如中缀表达式)时,我们需要确保操作数的顺序正确。例如,在后缀表达式“3 4 +”中,加法操作符“+”位于操作数“3”和“4”之后。因此,在转换为中缀表达式时,我们需要将操作数重新排序为“3 + 4”,这正是“expr → term { operator term }”产生式所反映的结构。- 在文法定义中,“expr → term { operator term }”这样的产生式意味着表达式(
expr
)由一个项(term
)开始,后面可能跟着一个或多个由操作符(operator
)和另一个项(term
)组成的序列。在后缀表达式中,操作符总是位于它操作的两个操作数之后。- 如果我们写成“expr → term { term operator }”,这实际上是不正确的,因为它暗示了操作符后面紧跟着的是另一个项,然后才是之前的项,这与后缀表达式的实际结构相反。简单来说,这个产生式错误地指示了解析器先去寻找一个项(term),然后去寻找另一个项,最后才去寻找操作符(operator)。这实际上与后缀表达式的结构不符,因为在后缀表达式中,操作符应该紧跟在它的操作数之后。。
- 简而言之,正确的顺序“term operator term”反映了在后缀表达式中操作符位于两个操作数之后的事实,而错误的顺序“term term operator”则不符合这种结构。
📇参考答案
productions:
expr -> expr expr +| expr expr -| expr expr *| expr expr /| digit
translation schemes:
expr -> expr {print("+")} expr +| expr {print("-")} expr -| {print("(")} expr {print(")*(")} expr {print(")")} *| {print("(")} expr {print(")/(")} expr {print(")")} /| digit {print(digit)}
Another reference answer
E -> {print("(")} E {print(op)} E {print(")"}} op | digit {print(digit)}
🧵练习2.3.3
🧩题目
构建一个将整数翻译成罗马数字的语法制导方案。
📇思路
罗马数字的组合规则可以总结如下:
基本符号:罗马数字系统使用七个不同的符号来表示数值:
I
(1)、V
(5)、X
(10)、L
(50)、C
(100)、D
(500) 和M
(1000)。数值表示:
I
、X
、C
和M
可以被重复最多三次来表示它们的倍数(例如:II
= 2,XXX
= 30,CC
= 200, 但IIII
不是标准的表示法,应为IV
)。V
、L
和D
不可以被重复。减法原则:当一个小数值的符号出现在一个较大数值的符号左边时,表示应从大数中减去小数(例如:
IV
= 4,IX
= 9,XL
= 40,XC
= 90,CD
= 400,CM
= 900)。加法原则:当一个小数值的符号出现在一个较大数值的符号右边时,或者相同数值的符号连续出现时,表示应将它们相加(例如:
VI
= 6,XI
= 11,XX
= 20,CCC
= 300)。避免重复四次:罗马数字中不会出现连续四个相同的符号(如
IIII
或XXXX
)。应使用减法原则来表示这些数值(如IV
代替IIII
,XL
代替XXXX
)。从左到右:罗马数字应从左到右按照上述规则进行解读。
千位以上的表示:千位以上的数字可以通过重复
M
来表示(例如:MM
= 2000,MMM
= 3000)。组合顺序:在表示一个数时,应从最高位开始,逐步降低到最低位。例如,数字 1994 应表示为
MCMXCIV
(1000 + (1000 - 100) + (100 - 10) + (5 - 1))。零的表示:罗马数字系统中没有专门的符号来表示零。零值是通过省略相应的符号来表示的。
基于以上规则,一个更准确且简化的罗马数字文法可能是这样的;请注意,这个文法仍然不是完美的,因为它允许像
"IIII"
这样的非标准表示:roman → thousand* hundred ten unit thousand → "M" {"M"} hundred → "CM" | "CD" | "C" {"C" | "CC" | "CCC"} | "D" {"C" | "CC" | "CCC"} | "M" {"CM" | "CD" | "C" {"C" | "CC" | "CCC"} | "D" {"C" | "CC" | "CCC"}} ten → "XC" | "XL" | "X" {"X" | "XX" | "XXX"} | "L" {"X" | "XX" | "XXX"} | "IX" | "IV" | "V" {"I" | "II" | "III"} | "I" {"X" | "V"} unit → "I" {"I" | "II" | "III"} | "IV" | "V" {"I" | "II" | "III"} | "VI" | "VII" | "VIII" | "IX"
📇答题
经过前3道题与AI无尽的争吵(具体来说,我对于语法学不明白,而AI觉得语法制导翻译方案不实用);因此,我们决定彻底摆烂,以下用C++代码解题(?):
#include <string>
#include <iostream>
using namespace std;std::string intToRoman(int num) {std::string roman = "";std::string thousands[] = { "", "M", "MM", "MMM" };std::string hundreds[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" };std::string tens[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };std::string ones[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" };// 千位 roman += thousands[num / 1000];num %= 1000;// 百位 roman += hundreds[num / 100];num %= 100;// 十位 roman += tens[num / 10];num %= 10;// 个位 roman += ones[num];return roman;
}int main() {int number = 0;cout << "请输入整数(0-3999):\t" ;cin >> number;string romanNumeral = intToRoman(number);cout << romanNumeral << std::endl;return 0;
}
🧵练习2.3.4
🧩题目
构建一个将罗马数字翻译成整数的语法制导方案。
📇答题
#include <iostream>
#include <string>
#include <unordered_map> int romanToInt(std::string s) {std::unordered_map<char, int> romanValues = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000}};int result = 0;// 从左向右遍历字符串,取出第i个字符for (size_t i = 0; i < s.length(); ++i) {int value = romanValues[s[i]];// 若第i+1个字符存在,且第i个字符<第i+1个字符,则结果减去第i个字符的值(第3条,减法原则),反之,则增加第i个字符的值(第4条,加法原则)if (i + 1 < s.length() && value < romanValues[s[i + 1]]) {result -= value;}else {result += value;}}return result;
}int main() {std::string romanNumeral = "MMMDXLIX";int number = romanToInt(romanNumeral);std::cout << number << std::endl; // 输出: 3549 return 0;
}
🔚结语
博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶🌫️😶🌫️
我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟
同系列的博文:🌸编译原理_梅头脑_的博客-CSDN博客
同博主的博文:🌸随笔03 笔记整理-CSDN博客
相关文章:

编译原理2.3习题 语法制导分析[C++]
图源:文心一言 编译原理习题整理~🥝🥝 作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡 第1版:自…...

JUC-CAS
1. CAS概述 CAS(Compare ans swap/set) 比较并交换,实现并发的一种底层技术。它将预期的值和内存中的值比较,如果相同,就更新内存中的值。如果不匹配,一直重试(自旋)。Java.util.concurrent.atomic包下的原…...

Effective C++——关于重载赋值运算
令operator返回一个*this的引用 在重载,,*等运算符时,令其返回一个指向this的引用。 class MyClass {int* val; public:MyClass(int i) : val(new int(i)){}MyClass():val(new int(0)){}void print() {cout << *val << endl;}MyClass& operator(co…...

vscode debug
需要对GitHub上的工程debug。 所以花时间看了下,参考了bili视频和chatgpt的解答。 chatgpt给的步骤 要在 VS Code 中调试 C++ 项目,可以按照以下步骤进行设置和操作: 确保已安装 C++ 扩展:在 VS Code 中选择 “Extensions”(或使用快捷键 Ctrl+Shift+X),搜索并安装官…...

数据库选型其实技术维度不太重要
看到这个标题可能觉得我在乱说,数据库选型要从多个角度和维度看来,还有各种POC。很多供应商朋友告诉我POC是一个漫长的过程,非常痛苦,要解决各种技术问题。怎么能说和技术无关呢? 因为从我的经历和周围听说的经验来说…...

【C++】入门(二)
前言: c基础语法(下) 文章目录 五、引用5.1 引用概念5.2 引用使用规则5.3 常引用5.4 引用的使用场景5.5 引用和指针的区别 六、内联函数6.1 概念6.2 内联函数的特性 七、auto关键字(C11)7.1 概念7.2 使用规则7.3 用于f…...

Nginx 代理服务路径带/和不带/的问题
nginx初始配置如下 server {listen 6087;location / {#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。#例如,您的网站运行目录在/etc/www下,则填写/etc/www。#允许跨域请求的域,* 代表所有add_header Access-Control-…...

C# CefSharp 输入内容,点击按钮,并且滑动。
前言 帮别人敲了个Demo,抱试一试心态,居然成功了,可以用。给小伙伴们看看效果。 遇到问题 1,input输入value失败,里面要套了个事件,再变换输入value。后来用浏览器开发工具,研究js代码,太难了&a…...

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!
本月,比特币庆祝了它的15岁生日,并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金(ETF),已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…...

GBASE南大通用的接口程序GBase ADO.NET
GBase ADO.NET 是一个提供.NET 应用程序与 GBase 数据库之间方便、高效、 安全交互的接口程序,使用 100%纯 C#编写,并继承了 Microsoft ADO.NET 类。 开发人员可以使用任何一种.NET 开发语言(C#、VB.NET、F#)通过 GBase ADO.NET 操…...

算法训练营Day57(回文子串--总结DP)
647. 回文子串 647. 回文子串 - 力扣(LeetCode) class Solution {public int countSubstrings(String s) {int len s.length();//i到j这个子串是否是回文的boolean [][] dp new boolean[len][len];int res 0;for(int i len-1;i>0;i--){for(int …...

使用OpenCV从一个矩阵提取子矩阵
介绍opencv的两个函数:Range()和Rect() Range()是用于表示一个范围的类。它的构造函数有两个整数参数,分别表示范围的起始和终止索引。这个范围包括起始索引但不包括终止索引。 cv::Range(int start, int end); /* 在OpenCV中,cv::Range() …...

微信云托管:基本使用指南
微信云托管 🚨推荐:微信云托管:基本使用指南 确实是个好平台,部署个项目很简易,免去了很多运维上的事情。 一、微信云托管 github 流水线配置 和 端口号 首先,这里的主体(宿主机),指的就是你的…...

WEB前端IDE的使用以及CSS的应用
IDE的使用 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…...

python中排序函数sorted的简单运用
# 假设a里面的()分别对应的x,y,w,h 即 (x,y,w,h) a [(2,3,1,2),(4,1,2,2),(1,6,2,1)] # a:传入的列表 # key 排序的数据 keylambda x:x[n] 是固定写法,里面的n代表你按照()中第几个数据的值排序 # eg:我们这里是x:x[0]表示我们按x排序, 如果改成x:x[1]则按y排序 # …...

k8s的helm
1、在没有helm之前,部署deployment、service、ingress等等 2、helm的作用:通过打包的方式,deployment、service、ingress这些打包在一块,一键部署服务、类似于yum功能 3、helm:官方提供的一种类似于仓库的功能&#…...

[MySQL]基础的增删改查
目录 1.前置介绍 2.数据库操作 2.1显示当前数据库 2.2创建数据库 2.3 使用数据库 2.4 删除数据库 3.常用数据类型 3.1整型和浮点型 3.2字符串类型 4.表的操作 4.1查看表结构 4.2创建表 4.3删除表 5.重点 5.1操作数据库 5.2常用数据类型 5.3操作表 1.前置介绍 …...

简易播放器 以及触发的异常
jl 1.0.jar 架包导入步骤: 1.读取到MP3音频文件 2.创建播放器对象,传入音频文件 3.开始播放 package com.ztt.Demo01;import java.io.FileInputStream; import java.io.FileNotFoundException;import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.…...

【Flutter跨平台插件开发】如何实现kotlin跟C++的相互调用
【Flutter跨平台插件开发】如何实现kotlin跟C的相互调用 kotlin 调 c 在 Kotlin 中,可以使用 JNI (Java Native Interface) 来调用 C 代码 调用步骤: 创建 C 文件并实现函数。 // example.cpp #include <jni.h>extern "C" JNIEXPORT jstring J…...

Apache SeaTunnel社区荣获“2023快速成长开源项目”奖项
在这个开源理念推动技术创新和全球协同发展的时代,SeaTunnel社区在开放原子开源基金会举办的2023年开源项目评选中脱颖而出,荣获“2023快速成长开源项目”殊荣。 这个奖项不仅仅是对Apache SeaTunnel社区过去一年发展速度和质量的认可,更是对…...

Unity 桥接模式(实例详解)
文章目录 示例1:角色与装备系统示例2:UI控件库示例3:渲染引擎模块示例4:AI决策树算法示例5:物理模拟引擎 在Unity游戏开发中,桥接模式(Bridge Pattern)是一种设计模式,它…...

Xftp连接不上Linux虚拟机的原因解决方法
前言: 在当今数字化时代,远程连接到Linux虚拟机是许多开发者和系统管理员日常工作的一部分。然而,有时候,面对Xftp连接不上Linux虚拟机的问题,我们可能感到困惑和无措。这个看似小问题可能导致工作中断,因…...

代码随想录刷题笔记 DAY12 | 二叉树的理论基础 | 二叉树的三种递归遍历 | 二叉树的非递归遍历 | 二叉树的广度优先搜索
Day 12 01. 二叉树的理论基础 1.1 二叉树的种类 满二叉树:除了叶子节点以外,每个节点都有两个子节点,整个树是被完全填满的完全二叉树:除了底层以外,其他部分是满的,底部可以不是满的但是必须是从左到右连…...

Linux问题 apt-get install时 无法解析域名“cn.archive.ubuntu.com”
问题描述: 在安装程序时会出现无法解析域名的错误 解决办法: 1、编辑文件 sudo vim /etc/resolv.conf 2、在最后加上(按键 i 进入编辑模式) nameserver 8.8.8.8 3、保存退出(:wq)...

蓝桥--鸡哥的购物挑战OJ(4169)
题目: 思路: 暴力: 直接枚举所有得偶数区间,找最大值,n2超时 优化: 分类讨论,只要醉倒不重不漏得分类不出意外就能AC了 图中的选择方式很简单了,不做解释了。 AC代码(我的代码可…...

MySQL--删除数据表(6)
MySQL中删除数据表是非常容易操作的,但是你在进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。 语法 以下为删除 MySQL 数据表的通用语法: DROP TABLE table_name ; -- 直接删除表,不检查是否存在 或 DROP…...

常用界面设计组件 —— 时间日期与定时器
2.7 时间日期与定时器2.7.1 时间日期相关的类2.7.2 日期时间数据与字符串之间的 转换2.7.3 QCalendarWidget日历组件2.7.4 定时器 2.7 时间日期与定时器 2.7.1 时间日期相关的类 时间日期是经常遇到的数据类型,Qt中时间日期类型的 类如下: QTime &…...

GO 中高效 int 转换 string 的方法与高性能源码剖析
文章目录 使用 strconv.Itoa使用 fmt.Sprintf使用 strconv.FormatIntFormatInt 深入剖析1. 快速路径处理小整数2. formatBits 函数的高效实现 结论 Go 语言 中,将整数(int)转换为字符串(string)是一项常见的操作。 本文…...

YOLOv7调用摄像头检测报错解决
yolov7detect.py文件调用本地摄像头,把source参数设为0 parser.add_argument(--source, typestr, default0, helpsource) # file/folder, 0 for webcam 报错:cv2.error: OpenCV(3.4.2) 一堆地址:The function is not implemented. Rebuild the library…...

Git学习 -- 分支合并、版本修改相关
目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的…...