#binary #string #token-stream #token-tree #text

ilex

为 C 类语言提供的快速简单的词法分析器

1 个不稳定版本

0.5.0 2024年2月24日

#2548解析器实现

Apache-2.0

435KB
11K SLoC

ilex

ilex - 为 C 类语言提供的无痛苦词法分析。⛩️🎋

这个crate提供了一个“C类语言”的通用词法分析器,有时也称为“花括号语言”。它高度可配置,并具有全面的Span支持。这个库是基于我多年来从项目到项目复制的特定解析器堆栈,并在我的职业生涯中多次逐字重写。

内部使用来自regex_automata的惰性DFA进行大部分繁重的工作,因此它应该具有合理的性能,尽管速度不是优先考虑的因素。

这个库的目标如下。

  • 可预测的贪婪。始终在任何特定位置解析最长的令牌,并在相同长度的令牌之间使用用户定义的歧义消除。

  • 易于设置。编写词法分析器是一大堆痛苦,它们看起来都差不多,你想要“快速完成”。

  • 灵活。它可以解析相当大量的语法。它应该能够处理任何与C有粗略相似性的语言,如Rust、JavaScript(和JSON)、LLVM IR、Go、Protobuf、Perl等。

    • 不支持一些奇特的词素。这包括Python和YAML的显著空白、在Haskell中会打乱词法分析器的用户定义运算符以及当没有明显的成对令牌作为成对的开/闭定界符时要处理的ALGOL风格的end(Ruby有这个问题)。
  • Unicode 支持。这意味着例如 エルフーン 默认情况下是一个标识符。存在仅用于向后兼容旧内容的ASCII过滤。 ilex 只支持UTF-8编码的输入文件,并始终使用Unicode定义的空白字符来分隔令牌,而不仅仅是ASCII空白字符(" \t\n\t")。

  • 诊断和范围。词法分析器应该能够生成相当不错的诊断,并且此API已公开,以便工具可以在词法分析器之上发出诊断。范围将自动合并。

    • 自定义错误恢复很困难,所以我计划不支持它。
  • 标记树。 标记树比标记流是一个更好的抽象,因为许多LR(k)花括号语言如果决定每对未知内容的花括号或括号都在内部,就会变得正规或接近正规。

这个库还提供了基本的软件浮点支持。如果你关心字节对字节的可移植性,永远不要将用户提供的文本转换为硬件浮点数。这个库可以帮助你做到这一点。

稳定性基本原则

我已经尝试精确地定义规则如何映射到内部有限自动机,但是变更仍然会发生!我将尽力在补丁版本之间不破坏东西,但我不能保证在即使是小版本发布中也能保持完美的稳定性。

为你的前端编写好的测试,并在可能的情况下不要暴露你的 ilex 内部结构。这将使你更容易地锁定版本并避免考虑这个问题。

诊断信息完全不稳定。不要尝试解析它们,也不要针对它们编写金测试。如果你必须这样做,请使用 [testing::check_report()] 以便你可以重新生成它们。

依赖项

~4–13MB
~132K SLoC