一个学生编写了两个上下文无关的语法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]
这个问题的测验