Compiler construction 使用给定的上下文无关语法规则导出给定的解决方案

Compiler construction 使用给定的上下文无关语法规则导出给定的解决方案,compiler-construction,context-free-grammar,Compiler Construction,Context Free Grammar,有一种由上下文无关语法定义的语言,其产生式规则如下: E -> T + E | T T -> F * T | F F -> (E) | C C -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 在此语法中,非终结符是E、T、F、和C;端子为括号、加号、星号和数字E是开始符号。下列哪项表明表达式7+3*(6+4)是该语言的一个句子 (a) E -> 7 + 3 * (F + T) (c) E -> 7 + 3 * (T)

有一种由上下文无关语法定义的语言,其产生式规则如下:

E -> T + E | T
T -> F * T | F
F -> (E) | C
C -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
在此语法中,非终结符是E、T、F、C;端子为括号、加号、星号和数字E是开始符号。下列哪项表明表达式7+3*(6+4)是该语言的一个句子

 (a) E -> 7 + 3 * (F + T)    (c) E -> 7 + 3 * (T)
 (b) E -> 7 + 3 * E          (d) E -> 7 + T * (E)

我得出了选项(d),但正确答案是选项(a)。为什么?请解释。谢谢

所提出的问题并不是很明确,因为不清楚选项(例如这四个选项之一)如何“显示”语言中的表达式

我对问题意图的最佳猜测是忽略每个选项中的“E->”,并询问这四个选项中的哪一个是可能出现在给定句子派生词中的句子形式

你可以将其分为两个问题:(1)哪些是句子形式(即,可以从
e
派生的形式),以及(2)哪些是派生给定句子的形式

在步骤(1)中,您可以消除(b)和(d):

re(b),如果您尝试派生
7+3*E
,您可以得到
7+3*T
,但是
T
不会派生
E

关于(d),如果你试图推导
7+T*(E)
,你可以得到
7+F*(E)
,但是
F
不会推导
T

在步骤(2)中,消除(c),因为尽管
7+3*(T)
可以从
E
派生,但
T
不会派生
6+4


因此答案是(a),因为
7+3*(F+T)
可以从
E
中派生,而
F
可以派生
6
,而
T
可以派生
4
所提出的问题并没有很好的定义,因为不清楚“显示”选项(例如这四个选项之一)意味着什么语言中有一个表达式

我对问题意图的最佳猜测是忽略每个选项中的“E->”,并询问这四个选项中的哪一个是可能出现在给定句子派生词中的句子形式

你可以将其分为两个问题:(1)哪些是句子形式(即,可以从
e
派生的形式),以及(2)哪些是派生给定句子的形式

在步骤(1)中,您可以消除(b)和(d):

re(b),如果您尝试派生
7+3*E
,您可以得到
7+3*T
,但是
T
不会派生
E

关于(d),如果你试图推导
7+T*(E)
,你可以得到
7+F*(E)
,但是
F
不会推导
T

在步骤(2)中,消除(c),因为尽管
7+3*(T)
可以从
E
派生,但
T
不会派生
6+4

因此答案是(a),因为
7+3*(F+T)
可以从
E
派生,而
F
可以派生
6
,而
T
可以派生
4