【问题标题】:Creating a regular grammar out of a regular expression从正则表达式创建正则文法
【发布时间】:2015-02-13 23:58:19
【问题描述】:

谁能指导我完成从正则表达式获取正则语法的过程?我找到了一些“教程”,但我仍然无法将更复杂的正则表达式转换为语法。

你会如何处理((a+b)*(c|d))+a?

我想

A -> aB
A -> aA
B -> bA
A -> cC
A -> dC
C -> cA
C -> dA
C -> a
C -> epsilon

但这显然是不正确的。

【问题讨论】:

  • 似乎没什么用。我只是想象它会是什么样子,画了一些有限状态机并检查我是否得到了我想要的。
  • @rici:哦,我误读了这个问题,评论被删除了。但我的观点仍然存在,因为它在有关自动机理论的书籍中有所描述。

标签: regex grammar regular-language


【解决方案1】:

从内到外工作。各运营商介绍 一个新的非终端

 Operator  Grammar     Operator  Grammar
 --------  -------     --------  -------
    R|S     A->R          R*      A->
            A->S                  A->AR

    R?      A->           R+      A->R
            A->R                  A->AR

(大多数说明也会引入新的非终结符进行连接;在这里,我没有打扰。我希望它不会造成混淆。)

例子:

((a+b)*(c|d))+a?

Sub-          Rewritten with   Rules for
expression    new nonterminal  new nonterminal
----------    ---------------  -----------
a+            A                A->a    A->Aa
a+b           Ab
(a+b)*        (Ab)*            B->     B->BAb
c|d           C                C->c    C->d
(a+b)*(c|d)   BC
(a+b)*(c|d)+  (BC)+            D->BC   D->DBC
a?            E                E->     E->a
(a+b)*(c|d)+  DE               S->DE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2022-12-05
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多