编译原理习题两则(龙书,写出语言的正则定义)
3.3.5.3
注释,即 /*
和 */
之间的串,且串中没有不在双引号("
)中的 */
。
注:假设双引号是匹配的。
思路:从空串开始写,写出整体框架后,通过分类讨论的方法不断进行扩充构造。
很容易想到整体结构为:
comment_begin content_without_end comment_end
且显然:
comment_begin -> /\*
comment_end -> \*/
下面需要通过分类讨论的方法构造出 content_without_end
。首先,由于其中的内容是自由的,所以它肯定是一个形如闭包的正则表达式((...)*
)。然后,容易想到内容里可以有被引号括起来的任意字符。因此我们定义:
quoted -> "[^"]*"
对于 content_without_end
的闭包中的其他情况,肯定是不在引号内的,所以一定不能出现 */
,还需要注意不要因为闭包出现 */
。下面继续分类讨论:
如果没有
*
出现在闭包中,是不会有问题的。所以可以认为闭包的形式形如:(quoted | [^*"] | ...)*
[^*"]
还排除了双引号,是因为我们假设了双引号是匹配的,所以双引号已经在quoted
中被处理了。如果
*
出现在了闭包中,后面是不能紧挨/
的,所以首先想到写成:\*[^/"]
(
*
一定不能结尾,否则\*
和[^*"]
会构成*/
,所以考虑这种情况时,后面一定接一个字符是合理的)但这么写会阻止连续的星号存在,所以修正为:
\*+[^/\*"]
但这还阻止了
*
后面紧跟双引号的情况,所以修正为:\*+([^/\*"] | quoted)
综上,闭包的形式为:
(quoted | [^*"] | \*+([^/\*"] | quoted))*
最后,由于以上思路认为 *
一定不能结尾,所以 content_without_end
的后面还需要补充任意多的 *
来修正整个字符串结尾是 ******/
的情况。
(quoted | [^*"] | \*+([^/\*"] | quoted))*\**
综上,答案为:
/\*(quoted | [^*"] | \*+([^/\*"] | quoted))*\*+/
受 VS Code 支持的正则表达式为:
/\*(?:"[^"]*"|[^\*"]|\*+(?:[^/\*"]|"[^"]*"))*\*+/
样例文本:
/* test "/* test */" */ */
3.3.5.6
所有由偶数个 a
和奇数个 b
构成的串。
思路:容易想到拿走一个 b
(因为有奇数个 b
,所以一定存在),则剩下的串有偶数个 a
和偶数个 b
。但拿走中间的字符无法保证两端串的结构,所以我们拿走开头的字符。枚举开头的字符即可。
首先注意到,3.3.2.5 给出了偶数个 a
、偶数个 b
的正则表达式:
eaeb -> (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*
它用到了两两分组的思路,可以注意下。两两分组后,每一组只有可能是 aa, ab, ba, bb
。但它还用到了整个字符串一定是偶数个字符的性质。
以
b
开头时,显然是b eaeb
。以
a
开头时,用类似的思路改变奇偶性,有:a(aa|bb)*(ab|ba) eaeb
把这两种情况并起来即可。
受 VS Code 支持的正则表达式为:
(?:a(?:aa|bb)*(?:ab|ba)(?:ab|bb)*(?:(?:ab|ba)(?:aa|bb)*(?:ab|ba)(?:aa|bb)*)*)|(?:b(?:ab|bb)*(?:(?:ab|ba)(?:aa|bb)*(?:ab|ba)(?:aa|bb)*)*)
编译原理习题两则(龙书,写出语言的正则定义)相关推荐
- 编译原理三大经典:龙书 虎书 鲸书
编译原理三大经典:龙书 虎书 鲸书 https://www.cnblogs.com/Amedeo/archive/2017/11/24/7881889.html https://book.douban ...
- 编译原理笔记3 词法分析 龙书
正则表达式(Regular Expression,RE) 啥是正则表达式//比较简单略写- 正则表达式(Regular Expression,RE) 是一种用来描述正则语言(3型语言)的更紧凑的表示方 ...
- 编译原理 最新版 (龙书) 简介and sources
本书全面.深入地探讨了编译器设计方面的重要主题,包括词法分析.语法分析.语法制导定义和语法制导翻译.运行时刻环境.目标代码生成.代码优化技术.并行性检测以及过程间分析技术,并在相关章节中给出大量的实例 ...
- 【最新合集】编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞
[最新合集]MOOC哈工大陈鄞 编译原理答案全集-->传送门 1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. c ...
- 编译原理课后题答案 龙书 机械工业出版社
https://github.com/fool2fish/dragon-book-exercise-answers
- 编译原理习题(含答案)——2程序设计语言及其文法——MOOC哈尔滨工业大学陈鄞配套
1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. cab C. bca D. Cba 3 设有文法G[S]:S-> ...
- 编译原理习题(含答案)——2程序设计语言及其文法——哈工大陈鄞配套版本
程序设计语言及其文法 1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. cab C. bca D. Cba 3 设有文法 ...
- 【最新合集】编译原理习题(含答案)_答案全集_MOOC慕课 哈工大陈鄞
[最新合集]编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_3词法 ...
- 编程笔试(解析及代码实现):求不重复数字之和给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次。请写出程序求出这两个只出现了一次的数字之和
编程笔试(解析及代码实现):求不重复数字之和给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次.请写出程序求出这两个只出现了一次的数字之和 目录 题目描述 代码实现 题目描述 ...
最新文章
- BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
- 在SQL Navigator 中做 oracle pl/sql SQL分析
- apache 设置禁止访问某些文件或目录
- DNS服务器配置之前传------基础知识普及
- Android studio第四次作业
- 质监执法通--移动质监执法系统项目实战
- Javascript基础知识笔记二
- isis 网络 level 2 iih_ngspice实例介绍2--直流扫描分析
- GMA Round 1 奇怪的数列
- Sketchfab下载器ArtStation资源下载操作说明中文网模型提取教程
- 人工智能离不开它——贝叶斯公式的前世今生
- 多亏了这些Word技巧,我才能15分钟完成所有工作!真是6到飞起
- shopee售后退款与退货规定
- python表情代码_python如何实现表情识别 python实现表情识别代码示例
- Visual Studio 2019 搭建Flex
- Docker for beginners
- Java8 In Action-3.高效 Java 8 编程(五)
- 多本期刊被SCIE剔除的背后:大规模增加特刊带来的问题(附Hindawi最新在检SCISSCI期刊目录)
- Hadoop集群SSH无密登录
- 工信部ICP查询接口(没有绕过验证码)
热门文章
- 手写简化版数据库--MYDB
- 无效的 URI: 未能分析主机名。
- 高等数学——反常积分的收敛法
- HTML静态页面之(盒子模型)
- 计算机网络毕业设计关于flash,《电大计算机网络毕业论文FLASH爱好者网站;的网页设计与制作》.doc...
- 计算机网络——标准化
- 助力AR眼镜轻量化,国内攻破二维扩瞳几何光波导量产
- linux docker查找镜像文件,搜索/下载/构建自定义/删除Docker镜像,运行和删除Docker容器的方法...
- 腾讯云发送短信验证码服务
- 为什么炒期货风险高(炒期货比炒股风险更高吗)