将正则表达式转换为常规语法/右线性语法

时间:2014-10-07 00:30:42

标签: regex grammar regular-language formal-languages

我想验证我是否正确地将此正则表达式转换为正确的线性语法,基于前一个问题的信息和Grijesh的精彩答案:Left-Linear and Right-Linear Grammars

这是一个问题:“编写一个常规(右线性)语法,生成由正则表达式表示的字符串集((10)+(011 + 1)+)*(0 + 101)*。”< / p>

以下是我建立的语法,最后一个是在底层:

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

1 个答案:

答案 0 :(得分:0)

到目前为止,一切都在向前看:

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