设有描述简单算术表达式的上下文无关文法如下,其中id表示单字母。与使用该文法描述的表达式a+b*c*d相符的语法树为()

E→E+T|T

T→F*T|F

F→id

答案:选项A:

e14b07c214f1c67e9ed778f1cb33d7ed.png

请先 登录 后评论

1 个回答

亚里士德
擅长:互联网

知识点:程序语言设计-编译程序基本原理

位于2.2.2章节。语法分析小节。2022、2021、2018、2016、2014、2009年都考过,难度应该是逐年增大的。

在大概81页,例题2-4。方法和书上面的例题几乎是一样的。

---

解题:

可能的步骤:

1、首先对各个选项进行中根遍历(中序遍历这个名词简直是对理解造成混乱,对新手极其不友好,用中根遍历可能更好理解。使用此顺序的原因可能是运算符在中间),结果发现所有的选项中中根遍历都可以推算出题中描述的表达式,浪费时间了。

2、然后,我们可以观察到描述的表达式里面加法和乘法,然后我们去找文法中哪个可以推出加法或者乘法符号。

3、可以观察到,描述的表达式有a+b,发现E可以推出E+T,所以先写一个E0作为根节点,然后画三条线(带不带箭头都可以吧)弄一个三叉树,左边是E1(E后面写个1表示是第一个E,后面同理,前面是E0表示第0个。你也可以不用标数字,只要你在构建树的时候能分清楚谁是谁)、中间是+号、右边是T1。

4、然后往后发现描述的表达式有b*c,发现T可以推出F*T,所以在刚才的三叉树的T1往下再画三条线,再弄一个三叉树,左边是F1、中间是乘号*、右边是T2。

5、后面还有c*d,所以还是同上,在T2往下再画三条线,再弄一个三叉树,左边是F2、中间是乘号*、右边是T3。

6、最后需要的答案是字母abcd,又因为在文法中,F可以推出id(所以后面一条路往下倒数第二个一定是F),而且E可以推出T,所以E1往下画一条线推出T4,又因为文法中T可以推出F,所以T4再往下推出F3,F3推出id。后面的子树同理,反正最终要推出id。最后的树大概长这个样子:

6f3d08cd6d73809ec34442e6a2c32ade.png

最后把id和运算符的结构保留下来,把中间无关的文法的字符去掉,弄成个二叉树,就可以得到选项A的结构。

请先 登录 后评论