我想验证我是否正确地将此正则表达式转换为正确的线性语法,基于前一个问题的信息和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
答案 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 --> 1S
和D --> 1S
来修复,从而允许任意数量的重复。
此对中出现同样的错误:
(0 + 101):
S --> 0 | 1A
A --> 0B
B --> 1
(0 + 101)*:
S --> 0 | 1A | ε
A --> 0B
B --> 1
第二个语法应该添加作品S --> 0S
和B --> 1S
以允许任意数量的重复。
其余的构造,看起来正确,并且连同上面提到的修复应该给出正确的语法。
注意:您可以通过以下方式执行此操作:
计算帐篷中的长杆是第2步;如果您能够(而不是完全确定自动机)消除epsilon / lambda转换,则此步骤甚至不是必需的。这就足够的原因是将DFA转换为常规语法的过程会将状态转换为非终结符号,并将转换f(q, s) = q'
映射到生成q := sq'
,如果q := s
也是如此q'
正在接受。只要NFA没有空转换,您就可以继续使用它。