将正则表达式转换为CFG

时间:2010-04-14 17:11:14

标签: regex grammar automata

如何将一些常规语言转换为等效的Context Free Grammar? 是否有必要构造与该正则表达式相对应的DFA,或者是否存在一些这种转换的规则?

例如,请考虑以下正则表达式

  

01 + 10(11) *

如何描述与上述RE相对应的语法?

3 个答案:

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

如果语言是由有限自动机描述的:

  • 将状态用作非终结符号
  • 使用语言作为终端符号集
  • 添加转换p - > aq用于任何过渡p - > q在原始自动机中的字母a上
  • 在语法中使用初始状态作为初始符号

答案 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。以上答案显示了实现这一目标的一些方法。

希望这能给你一个高水平的想法。