📜  门| GATE-CS-2016(套装2)|第 56 题

📅  最后修改于: 2021-09-24 06:24:22             🧑  作者: Mango

一个学生编写了两个上下文无关文法 G1 和 G2,用于生成一个类似 C 的数组声明。数组的维数至少为一。例如,

int a[10][3]; 

文法使用 D 作为起始符号,并使用六个终结符号 int ;编号 [ ] 编号。

Grammar G1
D → int L;
L → id [E
E → num]
E → num] [E

Grammar G2
D → int L;
L → id E
E → E[num]
E → [num] 

哪个语法正确生成了上面提到的声明?

(A) G1 和 G2
(B)只有 G1
(C)只有 G2
(D)既不是 G1 也不是 G2答案:(一)
说明:上下文无关语法

上下文无关文法 (CFG) 是一组递归重写规则(或产生式),用于生成字符串模式。

CFG 由以下组件组成:
1)一组终端的符号,这是出现在由语法产生的字符串的字母的字符。
2) 一组非终结符,它们是可以由非终结符生成的终结符号模式的占位符。
3) 一组产生式,这是用其他非终结符或终结符(产生式右侧)替换(或重写)字符串的非终结符(产生式左侧)的规则。
4) 开始符号,这是一个特殊的非终结符,出现在语法生成的初始字符串。

要从 CFG 生成字符串终端符号,我们:
1) 以一个由起始符号组成的字符串开始;
2) 应用左手尺寸带有开始符号的作品之一,用作品的右手边替换开始符号;
3) 重复选择字符串的非终结符的过程,并用相应产生式的右边替换它们,直到所有的非终结符都被终结符替换。


给定一个带有起始符号 S 的文法 G,如果有一些产生式序列,当应用于初始字符串S 时,会产生字符串s,那么 s 在 L(G) 中,即文法的语言。

我们需要检查两个语法中哪一个正确生成了“int a[10][3];”。这意味着我们需要检查是否 int id[num][num];

Grammar G1
D → int L;
L → id [E
E → num]
E → num] [E

Grammar G2
D → int L;
L → id E
E → E[num]
E → [num] 

gatecs-2016-问题
这个问题的测验