[英]converting context free grammar into regular expression
我目前正在查看 CFG 并看到了答案,但我不确定他们是如何得到的。 他们是如何把它从 CFG 转换成正则表达式的?
S -> aS|bX|a
X -> aX|bY|a
Y -> aY|a
answer:
R.E -> (a*(a+ba*a+ba*ba*a))
您应该学习我在回答“从正则表达式构建等效的正则语法”中所写的基本规则,这些规则将帮助您将“正则表达式转换为右或左线性语法”或“右或左线性”语法转换成正则表达式” - 两者。
但是,一种语言可以有多个正则表达式(和语法/自动机)。 下面,我试图解释如何在你的教科书中找到答案中给出的正则表达式。 准确阅读每个步骤并链接答案,以便您下次可以学习自己解决此类问题的方法。
第一步,要回答这样的问题,你应该清楚“这个语法产生了什么语言?” (同样,如果您有自动机,则尝试理解该自动机表示的语言)。
正如我在链接答案中所说,语法规则如下: S → eS | e
S → eS | e
对应于“plus clouser”并生成字符串e +
。 同样,您有三对这样的规则来在您的语法中生成a +
。
S → aS | a
X → aX | a
Y → aY | a
(注意: a +
也可以写成a * a
或aa *
– 描述一个或多个'a'
。)
另请注意,在语法中,您没有任何“空产生式”,例如A → ∧
,因此非变量S
、 X
或Y
可以为空,这意味着空字符串不是语法语言的成员,如: ε ∉ L(G)。
如果您注意到 start-variable 的S
产生式规则:
S → aS | bX | a
那么很明显,语言中的字符串 ω 可以以符号'a'
或以'b'
开头(因为您有两种选择来应用S
产生式,要么 (1) S → aS | a
给出'a'
作为第一个ω 中的符号,或 (2) S → bX
用于生成以符号'b'
开头的字符串)。
现在,L(G) 中可能的最小长度字符串 ω 是多少? – 最小长度字符串是"a"
,可以使用产生式规则: S → a
。
接下来需要注意的是"b"
∉L(G),因为如果苹果S → bX
再后来就必须更换X
在句型bX
使用一些X
的生产规则,因为我们知道X
也不能为空,因此有将总是后一些符号(一个或多个) 'b'
-换句话说从感伤bX
导出|ω|≥2。
从上面的讨论中可以看出,很明显,使用S
产生式规则,您可以分两步生成a*a
或a*bX
句子形式:
对于a*
重复使用S → aS
将得到S ⇝ a*S
(符号 ⇝ 表示不止一步)
将S
S ⇝ a*S
rhs 中的S ⇝ a*S
a*a
或a*bX
此外,如果您想将完整的表达式✎括起来,“ a*a
或a*bX
”可以写成S ⇝ a*(a + bX)
S ⇝ (a*(a + bX))
S ⇝ a*(a + bX)
或S ⇝ (a*(a + bX))
。
现在比较S
和X
产生规则都一样! 因此,正如我上面对S
所示,您还可以描述X
可用于生成句子形式X ⇝ (a*(a + bY))
。
要导出答案中给出的正则表达式,将X
替换为(a*(a + bY))
S ⇝ a*(a + bX)
(a*(a + bY))
in S ⇝ a*(a + bX)
,您将得到:
S ⇝ a*(a + b X )
S ⇝ a*(a + b (a*(a + bY)) )
现在,最后的Y
产生式规则相对来说非常简单 - 只需用于创建“plus clouser” a +
(或a*a
)。
所以让我们也用S
派生句形式替换Y
S ⇝ a*(a + b(a*(a + bY)))
⇝ a*(a + b(a*(a + ba*a)))
简化它,应用低分布两次以去除内括号并连接正则表达式 - P(Q + R)
可以写为PQ + PR
。 ✞
⇝ a*(a + b(a*(a + ba*a)))
⇝ a*(a + b(a*a + a*ba*a))
⇝ a*(a + ba*a + ba*ba*a)
✎ : + 在正式语言的正则表达式中使用两种语法 (i) + 作为二元运算符的意思是 – “联合运算” (ii) + 作为一元上标运算符的意思是 – “plus clouser”
✎ :在编程语言中的正则表达式中 + 仅用于“plus clouser”
✞ :在正则表达式中,我们使用 ∣ 符号表示并集,但这不完全是联合运算符。 在联合中 (A ∪ B) 与 (B ∪ A) 相同,但在正则表达式中 (A ∣ B) 可能不等于 (B ∣ A)
您可以从问题中观察到,除了作为 CFG 之外,语法也是正确的线性。 所以你可以为这个正确的线性文法构造一个有限自动机。 现在您已经构建了有限自动机,它们存在一个使用相同语言的正则表达式,并且可以使用本站点中给出的步骤完成转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.