繁体   English   中英

将上下文无关语法转换为正则表达式

[英]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 * aaa * – 描述一个或多个'a' 。)

另请注意,在语法中,您没有任何“空产生式”,例如A → ∧ ,因此非变量SXY可以为空,这意味着空字符串不是语法语言的成员,如: ε ∉ 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*aa*bX句子形式:

  1. 对于a*重复使用S → aS将得到S ⇝ a*S (符号 ⇝ 表示不止一步)

  2. S S ⇝ a*S rhs 中的S ⇝ a*S a*aa*bX

此外,如果您想将完整的表达式括起来,“ a*aa*bX ”可以写成S ⇝ a*(a + bX) S ⇝ (a*(a + bX)) S ⇝ a*(a + bX)S ⇝ (a*(a + bX))

现在比较SX产生规则都一样! 因此,正如我上面对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM