我需要帮助为下面的语言构建左线性和右线性语法?
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&角
答案 0 :(得分:79)
首先,我从一些简单的规则开始,用正则表达式(RE)构造正则语法(RG) 我正在为Right Linear Grammar编写规则(留下练习为Left Linear Grammar编写类似的规则)
注意:大写字母用于变量,小写用于语法终端。 NULL符号为^
。术语'任何数字' 表示*星形闭合的零次或多次。
[ BASIC IDEA ]
单一终端:如果RE只是e (e being any terminal)
,我们可以编写G
,只有一个生产规则S --> e
(其中S is the start symbol
1}}),是一个等价的RG。
UNION OPERATION:如果RE的格式为e + f
,e and f are terminals
,我们可以写G
两个生产规则S --> e | f
,是一个等效的RG。
加强:如果RE的格式为ef
,e and f are terminals
,我们可以使用两个生产规则G
S --> eA, A --> f
{ {1}},是一个等价的RG。
STAR CLOSURE:如果RE的格式为e*
,其中e is a terminal
和* Kleene star closure
操作,我们可以编写两个生产规则G
,S --> eS | ^
,是一个等效的RG。
PLUS CLOSURE:如果RE的格式为e + ,其中e is a terminal
和+ Kleene plus closure
操作,我们可以写G
,S --> eS | e
中的两个生产规则是等效的RG。
联盟上的星球关闭:如果RE的格式为(e + f)*,e and f are terminals
,我们可以在{{1}中编写三个生产规则},G
,是一个等价的RG。
关联联盟:如果RE的格式为(e + f) + ,两者都是S --> eS | fS | ^
,我们可以写e and f are terminals
中的四个生产规则G
是等效的RG。
明星关闭会话:如果RE的格式为(ef)*,S --> eS | fS | e | f
,我们可以在e and f are terminals
中编写三个制作规则,G
,是一个等价的RG。
加上关闭:如果RE的格式为(ef) + ,两者都是S --> eA | ^, A --> fS
,我们可以写三个生产e and f are terminals
中的规则G
是等效的RG。
请确保您理解以上所有规则,以下是摘要表:
S --> eA, A --> fS | f
注意:符号
+-------------------------------+--------------------+------------------------+ | 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
是终端,^是NULL符号,f
是起始变量
<强> [ANSWER] 强>
现在,我们可以找你问题。
a) S
语言描述:所有字符串均由0和1组成,至少包含一对
(0+1)*00(0+1)*
。
右线性语法:
S - &gt; 0S | 1S | 00A
A - &gt; 0A | 1A | ^
字符串可以以00
和0
的任意字符串开头,这就是为什么包含规则1
而且因为至少有一对s --> 0S | 1S
,所以没有空符号。包含00
因为S --> 00A
,0
可以在1
之后。符号00
负责A
之后的0&1和1。
左线性语法:
S - &gt; S0 | S1 | A00
A - &gt; A0 | A1 | ^
b) 00
语言描述:任意数字0,后跟任意数字10和11 {因为1(0 + 1)= 10 + 11}
右线性语法:
S - &gt; 0S | A | ^
A - &gt; 1B
B - &gt; 0A | 1A | 0 | 1
字符串以任意数量的0*(1(0+1))*
开头,因此包含规则0
,然后使用S --> 0S | ^
生成10
和11
的规则任意次数。
其他替代权利线性语法可以
S - &gt; 0S | A | ^
A - &gt; 10A | 11A | 10 | 11
左线性语法:
S - &gt; A | ^
A - &gt; A10 | A11 |乙
B - &gt; B0 | 0
另一种形式可以是
S - &gt; S10 | S11 | B | ^
B - &gt; B0 | 0
c) A --> 1B and B --> 0A | 1A | 0 | 1
语言描述:首先是语言包含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 - &gt; A00 | ^
A - &gt; B11 |小号
B - &gt; B01 | B10 |一个
(((01+10)*11)*00)*
因为任何字符串都为null,或者如果它不为null,则以S --> A00 | ^
结尾。当字符串以00
结尾时,变量00
与模式A
匹配。同样,此模式可以为null,也可以以((01 + 10)* + 11)*
结尾。如果为null,则11
再次与A
匹配,即字符串以S
之类的模式结束。如果模式不为空,则(00)*
与B
匹配。当(01 + 10)*
尽可能匹配时,B
会再次开始匹配字符串。这会关闭A
中的最多*。
右线性语法:
S - &gt; A | 00S | ^
A - &gt; 01A | 10A | 11S
问题的第二部分:
((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
无法生成。虽然两者都是由问题(a)的正则表达式生成的语言。
修改强>
为每个正则表达式添加DFA。这样人们就会发现它很有帮助。
a) 1000
b) (0+1)*00(0+1)*
c) 0*(1(0+1))*
为这个正则表达式绘制DFA既诡计又复杂 为此,我想添加DFA&#39>
为了简化任务,我们应该考虑RE的种类形成
对我而言,RE (((01+10)*11)*00)*
看起来像(((01+10)*11)*00)*
(a*b)*
实际上在上面的表达式(((01+10)*11)* 00 )*
( a* b )*
中,它以a
的形式自我表达
那是(a*b)*
RE ((01+10)*11)*
等于(a*b)*
。 (a b)的DFA如下:
(a + b)*b + ^
的DFA是:
((01+10)*11)*
的DFA是:
尝试找到上述三种DFA构造的相似性。不要先行,直到你不理解第一个
答案 1 :(得分:2)