Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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_Regular Language_Formal Languages - Fatal编程技术网

Regex 如何获得基于正则语法的正则表达式?

Regex 如何获得基于正则语法的正则表达式?,regex,regular-language,formal-languages,Regex,Regular Language,Formal Languages,问题是 正则文法G的生成规则是 S → 0A | 1B | ε , A → 1B | ε , B → 0A |ε, 将L(G)表示为正则表达式 我的解决办法如下 S = 0A + 1B+ ε A = 1B + ε B = 0A + ε 然后 我不知道如何在这里简化表达式。在此领域的任何帮助都将不胜感激。我们首先写出一些方程式: S = 0A + 1B + e A = 1B + e B = 0A + e 我们可以通过替换来消除B: S = 0A + 1(0A + e)+ e = 0A +

问题是

正则文法G的生成规则是

S → 0A | 1B | ε , A → 1B | ε , B → 0A |ε, 
将L(G)表示为正则表达式

我的解决办法如下

S = 0A + 1B+ ε
A = 1B + ε
B = 0A + ε
然后


我不知道如何在这里简化表达式。在此领域的任何帮助都将不胜感激。

我们首先写出一些方程式:

S = 0A + 1B + e
A = 1B + e
B = 0A + e
我们可以通过替换来消除B:

S = 0A + 1(0A + e)+ e = 0A + 10A + 1 + e
A = 1(0A + e)+ e = 10A + 1 + e
B = 0A + e
S = (0 + 10)(10)*(1 + e) + 1 + e
A = (10)*(1 + e)
B = 0(10)*(1 + e) + e
现在,我们可以消除A中的递归:

S = (0 + 10)A + 1 + e
A = (10)*(1 + e)
B = 0A + e
现在我们可以通过替换来消除A:

S = 0A + 1(0A + e)+ e = 0A + 10A + 1 + e
A = 1(0A + e)+ e = 10A + 1 + e
B = 0A + e
S = (0 + 10)(10)*(1 + e) + 1 + e
A = (10)*(1 + e)
B = 0(10)*(1 + e) + e
我们可以通过观察常见的1+e项、因子分解,然后注意到+10项不会增加任何内容,从而稍微简化S的表达式:

S = (0 + 10)(10)*(1 + e) + 1 + e
  = [(0 + 10)(10)* + e](1 + e)
  = (0 + e)(10)*(1 + e)
这似乎是{0,1}上既不包含00也不包含11的所有字符串的语言。为了证明这一点,我们可以显示正则表达式生成所有这样的字符串,并且它只生成这样的字符串

表达式生成的任何字符串都是三个字符串的串联:第一个字符串不能以1结尾,最后一个字符串不能以零开头,中间的字符串既不能以零开头,也不能以1结尾。因此,无法在边界处形成线00和11。很明显,这三个变量中没有一个可以包含00或11。因此,表达式生成的任何内容既没有00也没有11

可以生成任何不带00或11的字符串。假设这样的字符串以x开头,长度为n

如果n>0且x=0,表达式从第一部分中选择0,10次等于n减1,数量大于2,次;然后,它从第三部分中选择1,当且仅当n是偶数

如果n>0且x=1,表达式选择e作为第一部分,取10乘以等于n减1,数量乘以2,当且仅当n为奇数时,表达式选择1作为第三部分

如果n=0,表达式将为第一部分和第三部分选择空字符串,并花费10次零次


在这三种情况下,正则表达式都能够生成字符串。因为表达式在我们的语言中生成所有字符串,并且只生成字符串,所以它是我们描述的语言的正则表达式。

这可能吗?我的意思是这里有递归。另一方面,它似乎是
1
0
的交替序列?我不明白。顺便说一句,我看到了一个可能的解决方案:你的
1(0A+0B+ε)+0ε+ε
在我看来是错误的,这似乎是因为你在
0(1B+ε)+1(0A+ε)
中忘记了
a
B
,非终结符。你的正则表达式的元符号是什么?重复(
0..n
)是否为
*
?我想我们不会比
(01)更好∗+(10)∗+(01)∗0+(10)∗1
我已经链接到了。我们看到
(0+e)(10)*(1+e)
相当于
(1+e)(01)*(0+e)
。在这样的情况下,是否有某种标准形式表明人们更喜欢其中一种?顺便说一句:很好的解释,我已经在寻找一个好的介绍。这是一个很好的例子,说明了理论信息学在实践中的帮助。我想知道,如果我们先解决A,然后解决B,我们是否会得到另一种形式?我们通过应用规则机械地得到了这个形式,直到我们求解S。一般来说,会有无穷多个等价表达式,其中许多表达式在运算长度方面可能是相似的。非常感谢。我试图放弃,因为我无论如何都无法解决它,但这是一个很大的帮助。@bongbong如果这个答案对你有帮助,那么接受它是正确的选择(回答者获得+15,你获得+2)