有人可以帮我将语法转换为常规表达式吗

时间:2019-02-19 18:28:45

标签: grammar formal-languages

有人可以帮我将语法转换为正则表达式,并说明如何对某些复杂的语法进行处理吗?

S -> aA | bB
A -> aC | bC | a | b
B -> aC | bC | a | b
C -> aA

1 个答案:

答案 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”。