如何将一些常规语言转换为等效的Context Free Grammar? 是否有必要构造与该正则表达式相对应的DFA,或者是否存在一些这种转换的规则?
例如,请考虑以下正则表达式
01 + 10(11) *
如何描述与上述RE相对应的语法?
答案 0 :(得分:11)
将A + B更改为语法
G -> A
G -> B
将A *更改为
G -> (empty)
G -> A G
将AB更改为
G -> AB
并在A和B上递归递送。基本案例是空语言(没有制作)和单个符号。
在你的情况下
A -> 01
A -> 10B
B -> (empty)
B -> 11B
如果语言是由有限自动机描述的:
答案 1 :(得分:6)
我猜你的意思是将其转换为具有V-> w形式规则的正式语法,其中V是非终结符,w是终结符/非终结符串。首先,您可以简单地说(混合CFG和正则表达式语法):
S -> 01+10(11)*
其中S是起始符号。现在让我们分解一下(并为了清晰起见添加空格):
S -> 0 A 1 0 B
A -> 1+
B -> (11)*
关键是将*
es和+
es转换为递归。首先,我们将通过插入接受空字符串的中间规则将Kleene星转换为加号:
S -> 0 A 1 0 B
A -> 1+
B -> (empty)
B -> C
C -> (11)+
最后,我们将+
符号转换为递归:
S -> 0 A 1 0 B
A -> 1
A -> A 1
B -> (empty)
B -> C
C -> 11
C -> C 11
要处理x?
,只需将其拆分为生成空的规则和生成x的规则。
答案 2 :(得分:2)
实际上,不同的CFG语法可以产生相同的语言。因此,给定正则表达式(常规语言),它返回CFG的映射并不是唯一的。
当然,您可以构造一个导致给定正则表达式的CFG。以上答案显示了实现这一目标的一些方法。
希望这能给你一个高水平的想法。