【问题标题】:Why do we need FOLLOW set in LL(1) grammar parser?为什么我们需要在 LL(1) 语法分析器中设置 FOLLOW?
【发布时间】:2022-01-03 01:41:06
【问题描述】:

在生成的解析函数中,我们使用一种算法,该算法查看令牌列表并根据当前的非终端 FIRST 集选择规则(替代)。如果它包含一个 epsilon(规则可以为空),FOLLOW 集也会被检查。

考虑以下语法 [不是 LL(1)]:

B : A term
A : N1 | N2
N1 :
N2 :

在计算FOLLOW 集终端term 期间,将从A 传播到N1N2,因此FOLLOW 集不会帮助我们做出决定。

另一方面,如果确实有一个可以为空的替代方案,我们肯定知道如何继续执行,即使当前令牌与 FIRST 集中的任何内容都不匹配(通过选择epsilon 产生)。

如果上述陈述为真,FOLLOW 集是多余的。是否仅用于错误处理?

【问题讨论】:

  • 我看了讲座,看书,实现了 LL(1) 解析器生成器,用它制作了可用的 C 子集解析器,然后才弹出这个问题。如果您知道需要设置 FOLLOW 的示例,请指出给我。

标签: parsing context-free-grammar ll


【解决方案1】:

是的,是not necessary

我在座谈会上被问到这个问题,而我的回答是 FOLLOW 集被使用

  • 检查语法是否为 LL(1)
  • 发生错误时立即失败,而不是将格式错误的令牌拖到稍后的生产中,因为生成的失败消息可能不清楚
  • 别无其他

被接受

【讨论】:

    【解决方案2】:

    虽然您当然可以找到不需要 FOLLOW 的语法(即,它在解析表的计算中不起作用),但总的来说它必要的。

    例如,考虑语法

    S : A | C
    A : B a
    B : b | epsilon
    C : D c
    D : d | epsilon
    

    你需要知道

     Follow(B) = {a}
     Follow(D) = {c}
    

    计算

     First(A) = {b, a}
     First(C) = {d, c}
    

    为了在S做出正确的选择。

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2017-08-22
      相关资源
      最近更新 更多