有什么通用方法可以做到吗?例如,我们有一种通用的方法,通过添加生产S-> S1 | | | | | | | | | | | | | | | |,来查找L1 U L2的语法。 S2,其中S1和S2分别是L1和L2语法的起始符号。 在此先感谢。
答案 0 :(得分:0)
通常,给定G
这样的语法L(G) = L'
,没有算法总是产生G'
这样的规则语法L(G') = (L')*
。对于初学者来说,(L')*
可能不是常规语言。即使您允许该过程识别这种情况并在这种情况下打印“非常规语言”,这通常也是不可能的,因为这将使我们能够确定任意无限制的语法是否生成特定的字符串(这种构造不是太难,但是除非需要,否则我不会提供。这是一个无法确定的问题,因此我们无法识别无限制语法中的常规语言。
也许您的问题是,如果最初给出常规语法,是否有一个整洁的结构可以做到这一点。在这种情况下,答案是明确明确的“是!”这是一个很容易描述的方法(尽管在实践中可能效率低下),
因此,我们可以从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