Regex 将正则表达式转换为正则语法/右线性语法
我想验证一下,根据上一个问题的信息和Grijesh的精彩答案,我正在正确地将这个正则表达式转换为正确的线性语法: 问题是:“编写一个正则(右线性)语法,生成由正则表达式((10)+(011+1)+*(0+101)*表示的字符串集。” 下面是我建立的语法,最后一个在底部:Regex 将正则表达式转换为正则语法/右线性语法,regex,grammar,regular-language,formal-languages,Regex,Grammar,Regular Language,Formal Languages,我想验证一下,根据上一个问题的信息和Grijesh的精彩答案,我正在正确地将这个正则表达式转换为正确的线性语法: 问题是:“编写一个正则(右线性)语法,生成由正则表达式((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 -
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在这里之前,一切都正常:
((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闭包添加的不仅仅是空字符串:它允许整个模式重复。可能可以通过在第一个语法中添加productionsB-->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
,以允许任意数量的重复
结构的其余部分看起来是正确的,与上面提到的修复一起应该给出正确的语法
注意:您可以通过以下方式通过算法完成此操作:
f(q,s)=q'
映射到产品q:=sq'
,如果q'
被接受,也可以使用q:=s
。只要NFA没有空的转换,你就可以继续使用它