Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将正则表达式转换为正则语法/右线性语法_Regex_Grammar_Regular Language_Formal Languages - Fatal编程技术网

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

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 -

我想验证一下,根据上一个问题的信息和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 --> 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闭包添加的不仅仅是空字符串:它允许整个模式重复。可能可以通过在第一个语法中添加productions
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
,以允许任意数量的重复

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

注意:您可以通过以下方式通过算法完成此操作:

  • 使用算法从正则表达式生成NFA
  • 使用算法从NFA生成DFA
  • (可选)使用算法最小化DFA
  • 使用算法从DFA生成规则语法
  • 计算帐篷中的长杆是步骤2;如果您能够消除epsilon/lambda转换,而不是完全确定自动机,那么这个步骤甚至不是真正必要的。这就足够了,因为将DFA转换为常规语法的过程会将状态转换为非终结符号,并将转换
    f(q,s)=q'
    映射到产品
    q:=sq'
    ,如果
    q'
    被接受,也可以使用
    q:=s
    。只要NFA没有空的转换,你就可以继续使用它