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