上下文无关文法,数字范围

时间:2018-10-25 12:19:18

标签: context-free-grammar

我有一项家庭作业,要编写与以下语言指定的要求相符的上下文无关文法。

Context Free Grammer

我已经写了这个

My solution

但是看起来好像一样,我不确定这是否正确。

欢迎任何反馈/建议。我对如何编写“ n> = 1”部分非常困惑。

2 个答案:

答案 0 :(得分:0)

从问题和韦尔博格的评论看来,您不清楚语法的工作原理。您可能已经猜到了,它所要做的不只是写下与问题陈述中相同的数学符号。这是有关语法如何工作的简短说明。

语法有终端符号和非终端符号。终止符是语言字母中的符号,而非终止符只是语法用户的占位符。非终结符通过所谓的生产与非终结符和终结符的字符串相关。作品描述了可以用(右侧)替换非终止符号(左侧)的内容。文法有一个起始非终止符号(通常为S),据说它们生成或描述了字符串的语言,可以通过从起始非终止起始并依次应用产生式将所有非终止符号替换为终止符号来获得字符串的语言。例如,下面是语言a*b*的简单语法:

1) S -> AB        Nonterminals: S, A, B
2) A -> e         Terminals: a, b
3) A -> aA        Special: e is the empty string
4) B -> e
5) B -> bB

我们看到字符串aaabb的语言如下:

   S         start nonterminal
-> AB        production (1): S -> AB
-> aAB       production (3): A -> aA
-> aaAB      production (3): A -> aA
-> aaaAB     production (3): A -> aA
-> aaaB      production (2): A -> e
-> aaabB     production (5): B -> bB
-> aaabbB    production (5): B -> bB
-> aaabb     production (4): B -> e

因此,在您的情况下,我们希望创建一种语法,该语法最后生成1的{​​{1}}两倍,而所有0则在前面0个。为此,我们需要确保任何添加1的作品都将其添加在前面,而恰好在后面添加两个0。这样的生产是:

1

现在,仅凭此制作,我们将永远无法摆脱S -> 0S11 。我们需要通过添加一个用不引用非终结符的东西代替S的产生来摆脱S。一种选择是空字符串S

e

但是,我们可以看到它通过生成S -> 0S11 S -> e 生成了空字符串,它不是所需语言(其中S -> e)中的字符串。因此,我们必须尝试另一种生产方式。我们语言中最短的字符串是n >= 1,因此我们可以尝试

011

片刻的反思应该使您相信这可能是一种生成我们想要的语言的语法。

答案 1 :(得分:0)

S->0S11|011  

这是因为每个0代表2个1,而最小值(n> = 1)为011。 因此,可以是:

0S11
00S1111
000S111111
...   

直到获得011(退出循环):

000011111111