Parsing LR(k)解析表构造:是否可以按需计算前瞻集?

Parsing LR(k)解析表构造:是否可以按需计算前瞻集?,parsing,grammar,context-free-grammar,lalr,lr,Parsing,Grammar,Context Free Grammar,Lalr,Lr,我已经开始阅读关于LR(k)解析表构造的内容,所有解释k>0算法的文本都建议,在生成项目集之前,应计算每个符号的lookahead,然后在生成所有项目集时,应合并多余的项目集以生成最小的解析表 考虑以下伪状态/项目集构造例程: 首先假设状态转换可以在没有lookaheads(k=0)的情况下确定 计算当前状态的整个项集 尝试确定当前状态操作: 如果集合中只有一个项目,并且它已消耗了所有输入(标记到 在右侧,该动作减少到项目的左侧 如果集合中的每个项目都需要输入,则操作是移位并转到 下一个州 如

我已经开始阅读关于LR(k)解析表构造的内容,所有解释k>0算法的文本都建议,在生成项目集之前,应计算每个符号的lookahead,然后在生成所有项目集时,应合并多余的项目集以生成最小的解析表

考虑以下伪状态/项目集构造例程:

  • 首先假设状态转换可以在没有lookaheads(k=0)的情况下确定
  • 计算当前状态的整个项集
  • 尝试确定当前状态操作:
    • 如果集合中只有一个项目,并且它已消耗了所有输入(标记到 在右侧,该动作减少到项目的左侧
    • 如果集合中的每个项目都需要输入,则操作是移位并转到 下一个州
    • 如果有些项目需要输入,而有些项目不需要输入,则这是一种转移/减少冲突
    • 如果两个或多个具有不同lhs的项目到达输入端,则这是一个减少 /减少冲突。 如果最后两个案例中有一个发生了,这意味着我们需要提前考虑 决定状态操作。将k增加1,然后返回步骤2
  • 如果操作是移位,则继续创建后续操作 通过模拟输入组合(如果k>0,则为lookahead)并返回到 步骤1适用于每个新状态

  • 使用上述步骤为任意LR(k)语法构造表是否可能/可行?如果不可能,我缺少什么?

    您不能“计算当前状态的项集”.状态不是从树中拾取的;它们是计算出来的。在非常真实的意义上,状态和它的项集/前瞻性是不可区分的。这正是我思考如何计算状态的方式:从开始规则开始,计算它的项集和转换(如果有)同时,这就是我所说的“当前状态”:在这一点上,你几乎知道状态的一切),你所需要的就是使用当前项集递归地计算它的后续状态,然后关联转换。我想如果你继续这一思路,你会重新发现一些图表解析,或者可能是glr解析。这些都是强大的技术,再次变得流行起来。我确信仍有发现有待发现,因此我鼓励您继续,但这对cs.stackexchange.com来说更像是一个问题,而不是stackoverflow。寻呼机的车道跟踪算法可能就是您一直在寻找的(注意,它与搜索寻呼机时出现的车道表算法不同)。