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)*)*)

编译原理习题两则(龙书,写出语言的正则定义)相关推荐

  1. 编译原理三大经典:龙书 虎书 鲸书

    编译原理三大经典:龙书 虎书 鲸书 https://www.cnblogs.com/Amedeo/archive/2017/11/24/7881889.html https://book.douban ...

  2. 编译原理笔记3 词法分析 龙书

    正则表达式(Regular Expression,RE) 啥是正则表达式//比较简单略写- 正则表达式(Regular Expression,RE) 是一种用来描述正则语言(3型语言)的更紧凑的表示方 ...

  3. 编译原理 最新版 (龙书) 简介and sources

    本书全面.深入地探讨了编译器设计方面的重要主题,包括词法分析.语法分析.语法制导定义和语法制导翻译.运行时刻环境.目标代码生成.代码优化技术.并行性检测以及过程间分析技术,并在相关章节中给出大量的实例 ...

  4. 【最新合集】编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞

    [最新合集]MOOC哈工大陈鄞 编译原理答案全集-->传送门 1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. c ...

  5. 编译原理课后题答案 龙书 机械工业出版社

    https://github.com/fool2fish/dragon-book-exercise-answers

  6. 编译原理习题(含答案)——2程序设计语言及其文法——MOOC哈尔滨工业大学陈鄞配套

    1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. cab C. bca D. Cba 3 设有文法G[S]:S-> ...

  7. 编译原理习题(含答案)——2程序设计语言及其文法——哈工大陈鄞配套版本

    程序设计语言及其文法 1 文法:G:S→xSx | y所识别的语言是( ). 2 给定文法A→bA|ca,为该文法句子的是( ). A. bba B. cab C. bca D. Cba 3 设有文法 ...

  8. 【最新合集】编译原理习题(含答案)_答案全集_MOOC慕课 哈工大陈鄞

    [最新合集]编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_3词法 ...

  9. 编程笔试(解析及代码实现):求不重复数字之和​​​​​​​给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次。请写出程序求出这两个只出现了一次的数字之和

    编程笔试(解析及代码实现):求不重复数字之和给定一组整型数字,里面有且仅有两个数字值出现了一次,其他的数字都出现了两次.请写出程序求出这两个只出现了一次的数字之和 目录 题目描述 代码实现 题目描述 ...

最新文章

  1. BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
  2. 在SQL Navigator 中做 oracle pl/sql SQL分析
  3. apache 设置禁止访问某些文件或目录
  4. DNS服务器配置之前传------基础知识普及
  5. Android studio第四次作业
  6. 质监执法通--移动质监执法系统项目实战
  7. Javascript基础知识笔记二
  8. isis 网络 level 2 iih_ngspice实例介绍2--直流扫描分析
  9. GMA Round 1 奇怪的数列
  10. Sketchfab下载器ArtStation资源下载操作说明中文网模型提取教程
  11. 人工智能离不开它——贝叶斯公式的前世今生
  12. 多亏了这些Word技巧,我才能15分钟完成所有工作!真是6到飞起
  13. shopee售后退款与退货规定
  14. python表情代码_python如何实现表情识别 python实现表情识别代码示例
  15. Visual Studio 2019 搭建Flex
  16. Docker for beginners
  17. Java8 In Action-3.高效 Java 8 编程(五)
  18. 多本期刊被SCIE剔除的背后:大规模增加特刊带来的问题(附Hindawi最新在检SCISSCI期刊目录)
  19. Hadoop集群SSH无密登录
  20. 工信部ICP查询接口(没有绕过验证码)

热门文章

  1. 手写简化版数据库--MYDB
  2. 无效的 URI: 未能分析主机名。
  3. 高等数学——反常积分的收敛法
  4. HTML静态页面之(盒子模型)
  5. 计算机网络毕业设计关于flash,《电大计算机网络毕业论文FLASH爱好者网站;的网页设计与制作》.doc...
  6. 计算机网络——标准化
  7. 助力AR眼镜轻量化,国内攻破二维扩瞳几何光波导量产
  8. linux docker查找镜像文件,搜索/下载/构建自定义/删除Docker镜像,运行和删除Docker容器的方法...
  9. 腾讯云发送短信验证码服务
  10. 为什么炒期货风险高(炒期货比炒股风险更高吗)