Skip to main content
QUICK REVIEW

[论文解读] LL(1) Parsing with Derivatives and Zippers

Romain Edelmann, Jad Hamza|arXiv (Cornell University)|Nov 28, 2019
Logic, programming, and type systems参考文献 50被引用 5
一句话总结

本文提出了一种基于上下文无关表达式导数的、经过形式化验证的线性时间 LL(1) 解析算法,通过使用 zipper 数据结构进行优化。该算法支持高效、正确性可保证的解析组合子框架,具备静态 LL(1) 检查、枚举和美化打印功能,在保持函数式纯度和 Coq 中形式化验证的前提下,实现了 LL(1) 文法的最优性能。

ABSTRACT

In this paper, we present an efficient, functional, and formally verified parsing algorithm for LL(1) context-free expressions based on the concept of derivatives of formal languages. Parsing with derivatives is an elegant parsing technique, which, in the general case, suffers from cubic worst-case time complexity and slow performance in practice. We specialise the parsing with derivatives algorithm to LL(1) context-free expressions, where alternatives can be chosen given a single token of lookahead. We formalise the notion of LL(1) expressions and show how to efficiently check the LL(1) property. Next, we present a novel linear-time parsing with derivatives algorithm for LL(1) expressions operating on a zipper-inspired data structure. We prove the algorithm correct in Coq and present an implementation as a parser combinators framework in Scala, with enumeration and pretty printing capabilities.

研究动机与目标

  • 开发一种基于导数解析技术的、经过形式化验证的、高效的 LL(1) 上下文无关表达式解析算法。
  • 通过将通用导数解析技术特化为 LL(1) 文法,消除其最坏情况下的立方时间复杂度。
  • 将静态 LL(1) 检查集成到函数式解析组合子框架中,以在编译时防止文法设计错误。
  • 在统一、经过验证的框架中,不仅支持解析,还支持枚举和美化打印。
  • 通过使用受 zipper 启发的数据结构,实现线性时间性能的 LL(1) 解析,以高效管理解析状态。

提出的方法

  • 作者形式化定义了 LL(1) 上下文无关表达式,并为静态分析定义了可计算属性——生成性、可空性、首集合和不应跟随集合。
  • 提出一种新颖的线性时间解析算法,基于导数技术,并通过前瞻标记分析将该算法特化为 LL(1) 表达式。
  • 该算法采用 zipper 数据结构,以高效管理解析上下文并避免冗余计算。
  • 在 Coq 中对算法的正确性进行了形式化证明,且证明过程与实现高度一致。
  • 该方法被集成到 Scallion 中,这是一个基于 Scala 的解析组合子框架,支持解析、枚举和美化打印。
  • 该方法确保仅接受满足 LL(1) 性质的文法,从而避免歧义,并实现高效且可预测的解析。

实验结果

研究问题

  • RQ1通用的导数解析技术能否被优化,以在 LL(1) 文法上实现线性时间复杂度?
  • RQ2如何在函数式解析组合子框架中实现静态 LL(1) 检查并强制执行?
  • RQ3能否使用基于 zipper 的数据结构,在导数解析器中高效管理解析状态,同时保持正确性和性能?
  • RQ4是否可能对基于导数的 LL(1) 解析器进行形式化验证,并将其集成到支持枚举和美化打印的完整功能函数式框架中?
  • RQ5与现有的递归下降或 PEG 基解析组合子相比,该方法在性能和正确性方面表现如何?

主要发现

  • 所提出的算法在 LL(1) 解析中实现了最坏情况下的线性时间复杂度,克服了通用导数解析的立方时间复杂度。
  • 在 Coq 中的形式化验证确保了解析算法的正确性,且证明过程与实现高度一致。
  • 该框架不仅支持解析,还支持枚举和美化打印,显著扩展了解析组合子系统的实用性。
  • 使用 zipper 数据结构实现了高效、函数式的状态管理,避免了递归下降解析中的性能瓶颈。
  • 静态 LL(1) 检查机制通过在编译时验证 LL(1) 性质,有效防止了文法设计错误。
  • 在 Scallion 中的实现表明,基于导数的解析在实际应用中既高效又实用。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。