将正则表达式转换为 CFG
如何将一些常规语言转换为其等效的上下文无关语法? 是否有必要构建与该正则表达式相对应的DFA,或者这种转换是否有某种规则?
例如,考虑以下正则表达式
01+10(11)*
我该如何描述上面RE对应的语法?
How can I convert some regular language to its equivalent Context Free Grammar?
Is it necessary to construct the DFA corresponding to that regular expression or is there some rule for such a conversion?
For example, consider the following regular expression
01+10(11)*
How can I describe the grammar corresponding to the above RE?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
将A+B改为语法
<前><代码>G ->一个
G->乙
将 A* 更改为
<前><代码>G -> (空的)
G->股份公司
将 AB 更改为
<前><代码>G -> AB
并对 A 和 B 进行递归处理。基本情况是空语言(无产生式)和单个符号。
在您的情况下
如果语言是由有限自动机描述的:
Change A+B to grammar
Change A* to
Change AB to
and proceed recursively on A and B. Base cases are empty language (no productions) and a single symbol.
In your case
If the language is described by finite automaton:
我猜你的意思是用 V->w 形式的规则将其转换为正式语法,其中 V 是非终结符,w 是终结符/非终结符字符串。首先,您可以简单地说(混合 CFG 和正则表达式语法):
其中 S 是开始符号。现在让我们稍微分解一下(为了清晰起见,添加空格):
关键是将
*
和+
转换为递归。首先,我们将通过插入接受空字符串的中间规则将 Kleene 星号转换为加号:最后,我们将
+
表示法转换为递归:要处理
x?,只需将其拆分为生成空的规则和生成 x 的规则。
I guess you mean convert it to a formal grammar with rules of the form V->w, where V is a nonterminal and w is a string of terminals/nonterminals. To start, you can simply say (mixing CFG and regex syntax):
Where S is the start symbol. Now let's break it up a bit (and add whitespace for clarity):
The key is to convert
*
es and+
es to recursion. First, we'll convert the Kleene star to a plus by inserting an intermediate rule that accepts the empty string:Finally, we'll convert
+
notation to recursion:To handle
x?
, simply split it into a rule producing empty and a rule producing x .实际上,不同的CFG语法可以产生相同的语言。因此,给定一个正则表达式(正则语言),它映射回 CFG 不是唯一的。
当然,您可以构造一个产生给定正则表达式的 CFG。上面的答案展示了实现这一目标的一些方法。
希望这能给您一个高层次的想法。
Actually, different CFG grammars can produce the same language. So given a regular expression (regular language), its mapping back a CFG is not unique.
Definitely, you can construct a CFG that result in a given regular expression. The above answers shown some ways to achieve this.
Hope this gives you a high level idea.
对于示例,以下语法是等效的:
For the example, the following grammar is equivalent: