龙书上的表格:
(^在中括号内表示取补,否则表示和行的开头匹配,比如 ^ab匹配以ab开头的字符串)
Write regular definitions for the following languages:
- Comments, consisting of a string surrounded by /* and */, without an intervening */, unless it is inside double-quotes (")
- All strings of a’s and b’s that do not contain the substring abb.
第1题,参考答案:\ / \ * ( [ ^ * ” ] * | ” . * ” | \ * + [ ^ / ] ) * \ * \ /
理解:\ / \ *代表/*, \ * \ /代表*/,(因为/和 * 都具有特殊的含义,要使用它们的字面值,需要对它们进行转义,即加一个反斜杠 \ )
在上面/*和*/之间是一个大的闭包,它由2个|分成3部分,
第一部分: [ ^ * ” ] * 表示匹配不含有字符^和"的任意长度的字符串
第二部分:” . * ”表示匹配一对双引号,双引号之间匹配不包含换行符的任意长度的字符串,根据贪婪匹配原则,双引号之间还有双引号也没有问题。(疑问就是""根据龙书的规则匹配的是字面值,也就是匹配 .* ,所以我在后面的答案中对双引号进行了转义)
第三部分:\ * + [ ^ / ] 匹配到了1个或者多个 * ,且 * 后面没有斜杠 /
小括号外面的 * 号的作用是匹配到第三部分后,后面可以再继续从第一部分开始匹配
下面的答案还有一点不同之处是,它能够匹配一个双引号(参考答案中双引号至少要有2个才行,但是在C++的注释中是可以只有一个双引号的)
我的答案是: \ / \ * ( [ ^ * ” ] * | \” [a^a]* \” | " | \ * + [ ^ / ] ) * \ * \ /
第2题,b*(a+b?)*
以下图片均来自编译原理龙书:
\"\\
常见的正则表达式等价公式:
问题:怎么编程证明两个正则表达式是否等价