有人可以帮我将语法转换为正则表达式,并说明如何对某些复杂的语法进行处理吗?
S -> aA | bB
A -> aC | bC | a | b
B -> aC | bC | a | b
C -> aA
答案 0 :(得分:0)
您的语法:
S -> aA | bB
A -> aC | bC | a | b
B -> aC | bC | a | b
C -> aA
恰好是右规则语法。这样,它描述了一种常规语言,并且可以轻松地转换为确定性有限自动机:
q s q'
S a A
S b B
A a (C)
A b (C)
B a (C)
B b (C)
(C) a A
(C) b [D]
[D] a [D]
[D] b [D]
在这里,S是初始状态,C是接受状态,D是死亡状态。要获取正则表达式,请将此自动机视为NFA,并开始使用消除状态的正则表达式替换符号标签:
S = aA + bB
A = aC + bC + a + b
B = aC + bC + a + b
C = aA + bD
D = aD + bD
请注意,D = aD + bD = (a + b)D
仅在D = {}
时为真。重写:
S = aA + bB
A = aC + bC + a + b
B = aC + bC + a + b
C = aA
现在我们可以通过替换安全地消除C
:
S = aA + bB
A = aaA + baA + a + b = (aa + ba)A + (a + b)
B = aaA + baA + a + b = (aa + ba)A + (a + b)
现在我们可以使用规则Z = xZ + y => Z = x*y
:
S = aA + bB
A = (aa + ba)*(a + b)
B = aaA + baA + a + b = (aa + ba)A + (a + b)
现在替代:
S = aA + bB
A = (aa + ba)*(a + b)
B = (aa + ba)(aa + ba)*(a + b) + (a + b)
再次:
S = a(aa + ba)*(a + b) + b((aa + ba)(aa + ba)*(a + b) + (a + b))
现在我们可以将类似的术语分组:
S = (a(aa + bb)* + b(aa + ba)(aa + ba)* + b)(a + b)
请注意,可以将b(aa + ba)(aa + ba)* + b
分解为b((aa + ba)(aa + ba)* + e)
,并注意(aa + ba)(aa + ba)* + e = (aa + ba)*
:
S = (a(aa + bb)* + b(aa + ba)*)(a + b)
我们可以再次考虑:
S = (a + b)(aa + ba)*(a + b)
最后一个表达式是适合您的语言的良好,简洁,正确的正则表达式。它基本上是这样编码的:“先看一个符号,再看另一个符号,但是如果看到第三个符号,最好不要是b”。