【问题标题】:Parsing cases that need much lookahead解析需要大量前瞻的案例
【发布时间】:2011-09-17 17:08:41
【问题描述】:

大多数解析可以通过仅查看下一个符号(用于词法分析的字符,用于正确解析的标记)来完成,而其余大多数情况可以通过仅查看一个符号来处理。

对于实际使用的编程语言或数据格式,是否有任何实际案例需要多个或无限多个前瞻符号(或等效回溯)?

【问题讨论】:

    标签: parsing grammar lookahead


    【解决方案1】:

    我记得,Fortran 是一种需要大前瞻缓冲区的语言。解析 Fortran 需要(理论上)无限前瞻,尽管大多数实现都会限制语句行的长度,这会限制前瞻缓冲区的大小。

    另外,请参阅Why can't C++ be parsed with a LR(1) parser? 的选定答案。特别是引用:

    “C++ 语法有歧义,依赖于上下文,可能需要无限前瞻来解决一些歧义”。

    【讨论】:

    • 那句话对吗?我认为 C++ 可以被 LALR(1) 解析器解析已经得到充分证明,这显然是一个有界前瞻的解析器……
    • @Nowhereman:阅读链接问题的选定答案,包括引用的博士论文和提供特别好的示例的第二条评论。
    【解决方案2】:

    Knuth 证明了任何 LR(k) 文法都可以机械地转换为 LR(1) 文法。此外,AFAIK,任何 LR(k) 语法都可以按与解析字符串的长度成比例的时间进行解析。由于它包含 LR(1),我看不出用 k > 1 实现 LR(k) 解析有什么用。

    我从未研究过 LR(k)->LR(1) 转换,因此在某些情况下它可能并不实用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多