📜  门| GATE-CS-2016(Set 2)|第56章

📅  最后修改于: 2021-06-29 01:47:09             🧑  作者: Mango

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

int a[10][3]; 

语法使用D作为开始符号,并使用6个结束符号int; id [] 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] 

哪个语法正确生成上述声明?

(A) G1和G2
(B)仅G1
(C)仅G2
(D) G1和G2都不答案: (A)
说明:上下文无关文法

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

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

要从CFG生成字符串终端符号,我们:
1)以包含开始符号的字符串开头;
2)将其中一个带有开始符号的产品应用到左侧尺寸上,用产品的右侧替换开始符号;
3)重复选择字符串中非终结符的过程,并用一些相应生成的右侧替换它们,直到所有非终结符都已被终结符替换为止。


给定一个带有起始符号S的语法G,如果有一些生成序列在应用于初始字符串S时得出字符串s,则s用语法语言L(G)表示。

来源:https://www.cs.rochester.edu/~nelson/courses/csc_173/grammars/cfg.html

我们需要检查两个语法中的哪个正确生成了“ 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问题
这个问题的测验