[论文解读] Yacc is dead
本文提出两种基于广义导数概念的新型解析技术:一种用于上下文无关文法,另一种用于解析器组合子。该方法实现了一个紧凑高效的解析库(少于250行代码),可处理任意上下文无关文法,并生成惰性解析森林,使Scala和Haskell实现均能在S-表达式上实现每秒数百万个标记的性能。
We present two novel approaches to parsing context-free languages. The first approach is based on an extension of Brzozowski's derivative from regular expressions to context-free grammars. The second approach is based on a generalization of the derivative to parser combinators. The payoff of these techniques is a small (less than 250 lines of code), easy-to-implement parsing library capable of parsing arbitrary context-free grammars into lazy parse forests. Implementations for both Scala and Haskell are provided. Preliminary experiments with S-Expressions parsed millions of tokens per second, which suggests this technique is efficient enough for use in practice.
研究动机与目标
- 为解决传统解析工具(如Yacc)的局限性,提出一种新的、基于原理的解析上下文无关语言的方法。
- 开发一个轻量级、可组合的解析库,支持任意上下文无关文法,且无需手动转换文法。
- 实现高性能和实际效率,适用于真实世界应用,通过S-表达式的基准测试加以验证。
- 将先前用于正则表达式的导数技术推广至上下文无关文法和解析器组合子领域。
提出的方法
- 将Brzozowski的导数从正则表达式推广至上下文无关文法,通过计算导数实现增量解析。
- 定义一种广义导数操作,作用于解析器组合子,支持模块化和可组合的解析构造。
- 设计一种惰性解析森林表示法,以高效表示模糊文法的多种可能解析结果。
- 在Scala和Haskell中实现该方法,以证明其语言无关的适用性和实际可行性。
- 采用函数式、不可变风格,确保解析库的正确性和可组合性。
实验结果
研究问题
- RQ1正则表达式中的导数技术能否推广至处理任意上下文无关文法?
- RQ2能否通过广义导数操作增强解析器组合子,以支持高效且正确的解析?
- RQ3能否利用这些广义导数构建一个高性能、可组合的解析库?
- RQ4在实践中,这种基于导数的解析方法与传统工具(如Yacc)相比性能如何?
主要发现
- 广义导数方法成功推广至上下文无关文法,实现了对任意文法的正确且系统化的解析。
- 由此产生的解析库极为紧凑,在Scala和Haskell中均少于250行代码。
- 该实现具有高性能,可在S-表达式上实现每秒数百万个标记的解析速度,表明其实际效率。
- 使用惰性解析森林可高效处理模糊文法,且不牺牲性能。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。