我目前正在参加一个计算机体系结构课程,我正在尝试做一个家庭作业。
这项任务是在BNF进行的,即使在完成讲座,阅读幻灯片和在线查看之后,我仍然感到难过。
这是我的语法:
<expr>-><expr> + <term> |
<expr> - <term> |
<term>
<term>-><term> * <factor> |
<term> / <factor> |
<factor>
<factor>->(<expr>)|<id>
<id>->A|B|C|D
A + (C - D) / B
的解析树会是什么样子?
我只需要一点指导,我就能为自己解决这个问题。我的老师解释得不是很好,所以我希望通过外行人的方式解释如何解决这个问题?
答案 0 :(得分:0)
虽然没有说明,但我认为我们正在尝试将字符串 A +(C - D)/ B 解释为<expr>
(因为没有其他解析工作)。
<expr>
是一个非终结符号,即字面上不会出现最终字符串。相反,第一个规则(<expr> -> <expr> + <term> | <expr> - <term> | <term>
)告诉我们在一个<expr>
的字符串中期望什么符号。它声明<expr>
可以通过以下选项之一制作:
<expr> + <term>
,即<expr>
后跟+
后跟<term>
,或<expr> - <term>
,(同样解释)或<term>
如果没有深入了解解析器如何机械地做出决定,我们必须选择其中一个选项来继续构建解析树。我将选择第一个选项(<expr> + <term>
),该选项假定第一个<expr>
代表消息中的 A ,+
实际上是 + ,<term>
是剩余的(C - D)/ B 。因此,我们的解析树的开头看起来像:
<expr>
/ | \
/ | \
<expr> + <term>
这还不是一个完整的解析,因为规则中没有立即明确<expr>
可以给出结果 A 。同样,(C - D)/ B 不是<term>
的直接选项。我们可以通过以下方式回答第一个异议:
<expr>
可以是<term>
(通过<expr>
规则的第三个选项)<term>
反过来可以是<factor>
(通过<term>
规则的第三个选项)<factor>
可以是<id>
(通过<factor>
规则的第二个选项),最后<id>
可以是 A (通过<id>
规则的第一个选项)这一推理行填写解析树如下:
<expr>
/ | \
/ | \
<expr> | <term>
| |
<term> |
| |
<factor>|
| |
<id> |
| |
A +
我希望这可以让您了解规则的过程和含义,以便您可以进一步了解<term>
如何提供(C - D)/ B 和因此填写树的其余部分。