BNF解析树查询

时间:2014-10-29 07:14:23

标签: bnf

我目前正在参加一个计算机体系结构课程,我正在尝试做一个家庭作业。

这项任务是在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的解析树会是什么样子?

我只需要一点指导,我就能为自己解决这个问题。我的老师解释得不是很好,所以我希望通过外行人的方式解释如何解决这个问题?

1 个答案:

答案 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>的直接选项。我们可以通过以下方式回答第一个异议:

  1. <expr>可以是<term>(通过<expr>规则的第三个选项)
  2. <term>反过来可以是<factor>(通过<term>规则的第三个选项)
  3. <factor>可以是<id>(通过<factor>规则的第二个选项),最后
  4. <id>可以是 A (通过<id>规则的第一个选项)
  5. 这一推理行填写解析树如下:

          <expr>
          / | \
         /  |  \
     <expr> | <term>
       |    |
     <term> |
       |    |
    <factor>|
       |    |
      <id>  |
       |    |
       A    +
    

    我希望这可以让您了解规则的过程和含义,以便您可以进一步了解<term>如何提供(C - D)/ B 和因此填写树的其余部分。