我需要帮助为下面的语言构建左线性和右线性语法?
a) (0+1)*00(0+1)*
b) 0*(1(0+1))*
c) (((01+10)*11)*00)*
对于a)我有以下内容:
Left-linear
S --> B00 | S11
B --> B0|B1|011
Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1
它是否正确?我需要帮助b&c。
首先,我从一些简单的规则开始,从正则表达式(RE)构造正则语法(RG)。 我正在为Right Linear Grammar编写规则(留下练习为Left Linear Grammar编写类似的规则)
注意:大写字母用于变量,而小写用于语法中的终端。 NULL符号是^
。术语“任何数字”表示*星形闭合的零次或多次。
[基本理念]
e (e being any terminal)
,我们可以编写G
,只有一个生产规则S --> e
(其中S is the start symbol
),是一个等价的RG。e + f
,那么两个e and f are terminals
,我们可以写G
,有两个生产规则S --> e | f
,是一个等价的RG。ef
,那么两个e and f are terminals
,我们可以用两个生产规则G
写S --> eA, A --> f
,是一个等价的RG。e*
,其中e is a terminal
和* Kleene star closure
操作,我们可以在G
中编写两个生产规则,S --> eS | ^
,是等效的RG。e is a terminal
和+ Kleene plus closure
操作,我们可以在G
中编写两个生产规则,S --> eS | e
,是一个等价的RG。e and f are terminals
,我们可以在G
中编写三个生产规则,S --> eS | fS | ^
,是一个等价的RG。e and f are terminals
,我们可以在G
中编写四个生产规则,S --> eS | fS | e | f
,是一个等价的RG。e and f are terminals
,我们可以在G
中编写三个生产规则,S --> eA | ^, A --> fS
,是等效的RG。e and f are terminals
,我们可以在G
中编写三个生产规则,S --> eA, A --> fS | f
,是一个等价的RG。请确保您了解以上所有规则,以下是摘要表:
+-------------------------------+--------------------+------------------------+
| TYPE | REGULAR-EXPRESSION | RIGHT-LINEAR-GRAMMAR |
+-------------------------------+--------------------+------------------------+
| SINGLE TERMINAL | e | S --> e |
| UNION OPERATION | e + f | S --> e | f |
| CONCATENATION | ef | S --> eA, A --> f |
| STAR CLOSURE | e* | S --> eS | ^ |
| PLUS CLOSURE | e+ | S --> eS | e |
| STAR CLOSURE ON UNION | (e + f)* | S --> eS | fS | ^ |
| PLUS CLOSURE ON UNION | (e + f)+ | S --> eS | fS | e | f |
| STAR CLOSURE ON CONCATENATION | (ef)* | S --> eA | ^, A --> fS |
| PLUS CLOSURE ON CONCATENATION | (ef)+ | S --> eA, A --> fS | f |
+-------------------------------+--------------------+------------------------+
注意:符号
e
和f
是终端,^是NULL符号,S
是起始变量
[回答]
现在,我们可以找到你的问题。
a)(0+1)*00(0+1)*
语言描述:所有字符串由0和1组成,包含至少一对
00
。
0
s和1
s的任何字符串开始,这就是为什么包含规则s --> 0S | 1S
和因为至少有一对00
,没有空符号。包括S --> 00A
因为0
,1
可以在00
之后。符号A
负责00
之后的0和1。b)0*(1(0+1))*
语言描述:任意数字0,后跟任意数字10和11。 {因为1(0 + 1)= 10 + 11}
0
开头,因此包含规则S --> 0S | ^
,然后使用10
生成11
和A --> 1B and B --> 0A | 1A | 0 | 1
的规则。
其他可选的右线性语法也可以
S - > 0S | A | ^
A - > 10A | 11A | 10 | 11c)(((01+10)*11)*00)*
语言描述:首先是语言包含null(^)字符串,因为在()内部存在的每个东西外面都有*(星号)。此外,如果语言中的字符串不为null,则以00结尾为止。可以简单地以(((A)* B)* C)*的形式认为这个正则表达式,其中(A)*是(01 + 10) *这是01和10的任意重复次数。如果字符串中有A的实例,则会有一个B,因为(A)* B和B是11。 一些示例字符串{^,00,0000,000000,1100,111100,1100111100,011100,101100,01110000,01101100,0101011010101100,101001110001101100 ....}
S --> A00 | ^
因为任何字符串都为null,或者如果它不为null,则以00
结尾。当字符串以00
结尾时,变量A
匹配模式((01 + 10)* + 11)*
。同样,此模式可以为null或必须以11
结尾。如果它为null,则A
再次与S
匹配,即字符串以(00)*
之类的模式结束。如果模式不为null,则B
与(01 + 10)*
匹配。当B
匹配它时,A
再次开始匹配字符串。这关闭了((01 + 10)* + 11)*
中的最多*。你问的第二部分:
For a) I have the following:
Left-linear
S --> B00 | S11
B --> B0|B1|011
Right-linear
S --> 00B | 11S
B --> 0B|1B|0|1
(回答) 你解决方案是错误的,原因如下,
左线性语法错误因为字符串0010
无法生成。右线性语法错误因为字符串1000
无法生成。虽然两者都是由问题(a)的正则表达式生成的语言。
编辑 为每个正则表达式添加DFA。这样人们就会发现它很有帮助。
a)(0+1)*00(0+1)*
b)0*(1(0+1))*
c)(((01+10)*11)*00)*
为这个正则表达式绘制DFA既诡计又复杂。 为此,我想添加DFA
为了简化任务,我们应该认为RE的种类形成RE (((01+10)*11)*00)*
看起来像(a*b)*
(((01+10)*11)* 00 )*
( a* b )*
实际上在上面的表达a
它自我的(a*b)*
形式是((01+10)*11)*
RE (a*b)*
等于(a + b)*b + ^
。 (ab)的DFA如下:
((01+10)*11)*
的DFA是:
(((01+10)*11)* 00 )*
的DFA是:
试着找出上述三种DFA结构的相似性。在你不理解第一个之前不要前进