如果我们获得了语言L的语法,该如何找到L *的常规语法?

时间:2019-01-29 13:10:25

标签: regex grammar finite-automata

有什么通用方法可以做到吗?例如,我们有一种通用的方法,通过添加生产S-> S1 | | | | | | | | | | | | | | | |,来查找L1 U L2的语法。 S2,其中S1和S2分别是L1和L2语法的起始符号。 在此先感谢。

1 个答案:

答案 0 :(得分:0)

通常,给定G这样的语法L(G) = L',没有算法总是产生G'这样的规则语法L(G') = (L')*。对于初学者来说,(L')*可能不是常规语言。即使您允许该过程识别这种情况并在这种情况下打印“非常规语言”,这通常也是不可能的,因为这将使我们能够确定任意无限制的语法是否生成特定的字符串(这种构造不是太难,但是除非需要,否则我不会提供。这是一个无法确定的问题,因此我们无法识别无限制语法中的常规语言。

也许您的问题是,如果最初给出常规语法,是否有一个整洁的结构可以做到这一点。在这种情况下,答案是明确明确的“是!”这是一个很容易描述的方法(尽管在实践中可能效率低下),

  1. 使用典型构造将常规语法转换为不确定的有限自动机。左规则和右规则语法都有简单的构造。
  2. 使用任何已知的构造从不确定的有限自动机构造正则表达式。通常在证明等效性时使用一种这样的构造。
  3. 构造一个新的正则表达式,即最后一步中的Kleene闭包。
  4. 使用标准构造,从最后一步的正则表达式构造不确定的有限自动机。
  5. 从最后一步的不确定性自动机构造规则语法。有已知的构造。

因此,我们可以从L的常规语法到L*的常规语法。

如果您只想为L*使用任何语法,最简单的方法可能是引入一个新的起始状态S'和产生S' := S'S' | S,其中S是您的输入语法。显然,这不能给出规则的语法,但是-如果输入语法生成了规则的语言,那么该语法也可以。

示例:给出常规语法

S := 0S | 1T
T := 0S | 1T | 1

构造为我们提供了这种不确定的有限自动机:

q    s    q'
-    -    -
S    0    S
S    1    T
T    0    S
T    1    T
T    1    (H)

一个构造为我们提供了正则表达式:

(0*1)(0*1)*1

此Kleene封口为:

((0*1)(0*1)*1)*

我们从标准结构中认识到此自动机是等效的:

q    s    q'
-    -    -
(I)  -    S
S    0    S
S    1    T
T    0    S
T    1    T
T    1    H
H    -    (I)

发生以下常规语法:

I := S | -
S := 0S | 1T
T := 0S | 1T | H
H := I