【问题标题】:Converting regex to a regular grammar/right-linear grammar将正则表达式转换为常规语法/右线性语法
【发布时间】:2014-12-01 08:09:33
【问题描述】:

我想根据上一个问题的信息和 Grijesh 的精彩回答来验证我是否将此正则表达式正确转换为右线性语法:Left-Linear and Right-Linear Grammars

问题如下:“编写一个正则(右线性)语法,生成由正则表达式 ((10)+ (011 + 1)+)* (0 + 101)* 表示的字符串集。”

这是我建立的语法,最后一个在底部:

1:
S --> 1

0:
S --> 0

10:
S --> 1A
A --> 0

(10)+:
S --> 1A
A --> 0 | 0S

011:
S --> 0A
A --> 1B
B --> 1

(011 + 1):
S --> 0A | 1
A --> 1B
B --> 1

(011 + 1)+:
S --> 0A | 1 | 1S
A --> 1B
B --> 1 | 1S

(10)+ (011 + 1)+:
S --> 1A
A --> 0S | 0B
B --> 0C | 1 | 1B
C --> 1D
D --> 1 | 1B

((10)+ (011 + 1)+)*:
S --> 1A | ε
A --> 0S | 0B
B --> 0C | 1 | 1B
C --> 1D
D --> 1 | 1B

0:
S --> 0

101:
S --> 1A
A --> 0B
B --> 1

(0 + 101):
S --> 0 | 1A
A --> 0B
B --> 1

(0 + 101)*:
S --> 0 | 1A | ε
A --> 0B
B --> 1

((10)+ (011 + 1)+)* (0 + 101)*:
S --> 1A | ε | E
A --> 0S | 0B
B --> 0C | 1 | 1B
C --> 1D
D --> 1 | 1B | 1E
E --> 0 | 1F | ε
F --> 0G | 0E
G --> 1 | 1E

谁能帮我验证这是否正确?谢谢各位! :D

【问题讨论】:

    标签: regex grammar regular-language formal-languages


    【解决方案1】:

    直到这里,一切看起来都正确:

    ((10)+ (011 + 1)+)*:
    S --> 1A | ε
    A --> 0S | 0B
    B --> 0C | 1 | 1B
    C --> 1D
    D --> 1 | 1B
    

    你的内部表达式语法是正确的:

    (10)+ (011 + 1)+:
    S --> 1A
    A --> 0S | 0B
    B --> 0C | 1 | 1B
    C --> 1D
    D --> 1 | 1B
    

    请注意,唯一的区别是您允许生成空字符串。 Kleene 闭包添加的不仅仅是空字符串:它允许整个模式重复。可能,可以通过在第一个语法中添加产生式 B --> 1SD --> 1S 来解决此问题,从而允许任意数量的重复。

    这对出现同样的错误:

    (0 + 101):
    S --> 0 | 1A
    A --> 0B
    B --> 1
    
    (0 + 101)*:
    S --> 0 | 1A | ε
    A --> 0B
    B --> 1
    

    第二个语法应该添加产生式S --> 0SB --> 1S 以允许任意数量的重复。

    其余的结构看起来是正确的,加上上面提到的修复应该给出正确的语法。

    注意:您可以通过以下算法执行此操作:

    1. 使用算法从正则表达式生成 NFA
    2. 使用算法从 NFA 生成 DFA
    3. (可选)使用算法来最小化 DFA
    4. 使用算法从 DFA 生成正则文法

    计算帐篷中的长杆是第2步;如果您能够消除 epsilon/lambda 转换,而不是完全确定自动机,则此步骤甚至都不是必需的。这样做就足够的原因是,将 DFA 转换为常规语法的过程将状态转换为非终结符号,并将转换 f(q, s) = q' 映射到产生式 q := sq',如果 q' 接受,q := s 也是如此。只要 NFA 没有空转换,您就可以继续使用它。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多