如何为该语言制作CFG? 我有S-> S1S0S0 | S0S1S0S | S0S0S1S | epsilon,但我不确定如何使长度均匀。
答案 0 :(得分:0)
忽略| w |的约束的语法甚至:
S -> 00S1 | 0S01 | S001 | 010S | 01S0 | 0S10 | S010 | 100S | 10S0 | 1S00 | S100
S -> SS
S -> epsilon
我们如何强制| w |甚至?好吧,我们可以引入一个新的符号T来处理| w |的情况。很奇怪,根本不允许T产生ε。
S -> 001T | 00T1 | 0T01 | T001 | 010T | 01T0 | 0T10 | T010 | 100T | 10T0 | 1T00 | T100
S -> SS | TT
S -> epsilon
T -> 001S | 00S1 | 0S01 | S001 | 010S | 01S0 | 0S10 | S010 | 100S | 10S0 | 1S00 | S100
T -> ST | TS
为什么这样做?因为如果S生成偶数长度的字符串,而T生成奇数长度的字符串,则这些生成保留了该属性,并说明了从偶数长度到奇数长度的字符串的所有方式。因为我们不想接受奇数长度的字符串,所以我们不让T被消除。我们可以得出000011:
S -> 00T1 -> 0000S11 -> 000011
但我们无法得出000000111:
S -> 00T1 -> 0000S11 -> 000000T111 -> …?
相同的基本思想也适用于您的语法,但是我将其作为练习,因为我们的语法中每个字符串的S数更多,并且需要大量的乘积来说明产生偶数长度的S和T的组合。 / p>