3 个版本
0.0.4 | 2024年1月2日 |
---|---|
0.0.3 | 2023年10月2日 |
0.0.2 | 2022年9月22日 |
#51 在 解析工具
用于 hml-rs
73KB
1.5K SLoC
lexer-rs
此库提供了流管理和用于解析语言的上下文无关标记的框架。
此包处于alpha阶段;它在少数应用程序中使用,功能成熟,但API尚不稳定,但可能得到增强。
使用方法
将此添加到您的 Cargo.toml
[dependencies]
lexer-rs = "0.0.4"
版本
版本说明在 RELEASES.md 中。
许可证
许可协议为以下之一
任选其一。
贡献
除非您明确表示,否则任何旨在包含在作品中的贡献(根据Apache-2.0许可证的定义),均应按上述方式双许可,不得附加任何额外条款或条件。
lib.rs
:
词法分析库
此库提供了一种将数据解析成标记流的一般机制。
这在可读性语言编译器和解释器中很常见,用于将文本流转换成可以按该语言语法解析的值。
简单示例
计算器操作一个数字和数学符号的流;计算器必须执行的处理的第一步是将文本流转换为诸如“数字73”和“加号”这样的抽象标记。一旦计算器有了这样的标记,它就可以将它们组合成它可以评估的实际表达式。
基本概念
词法分析器的基本概念是将(例如)[字符]流转换为“标记”流,这是针对词法分析器的。词法分析器从文本的开始处开始,通过消耗字符到标记。
词法分析器实现
实现词法分析器并不困难,有很多人选择不同的方法。对于[String],一个非常简单的方法是使用一个循环,将字符串的开始与可能的标记值匹配(可能使用正则表达式),在找到匹配项后,它可以“修剪”字符串的前面,产生标记,然后再次循环。
文件中的位置
该组件提供了一些机制来跟踪解析流中的位置,以便为最终用户提供适当的错误信息。
至少要跟踪位置是跟踪文件中的字节偏移量;此外还可以跟踪行号和列号。[UserPosn]特质为此提供了支持。
Rust 使用 UTF8 编码的字符串,不是所有的字节偏移量都对应于流中的实际 [char],并且两个字符之间的列分隔并不是它们的字节偏移量之差。[PosnInCharStream]特质增加了对 [UserPosn] 特质的支持来管理这一点。
处理 UTF8 编码字符串的最简单的词法分析器不需要跟踪行和列;只需要使用字节偏移量跟踪即可;使用 [usize] 作为 [PosnInCharStream] 实现提供支持(因为 [str] 内部的字节偏移量)。
因此,[Lexer] 特质具有关联的流位置类型(其 'State'):它必须是轻量级的,因为频繁移动和复制,并且必须是静态的。
标记
[Lexer] 特质从其解析产生的标记类型由客户端提供;这通常是一个简单的枚举。
解析由 [Lexer] 管理,客户端提供匹配函数的切片;每个匹配函数依次应用,第一个返回 Ok 的 Some 标记的函数产生标记并推进解析状态。如果解析器检测到流中的真实错误(不仅仅是与标记类型的不匹配),则可以生成错误。
错误报告
使用 [Lexer] 内部的文件位置处理,可以显示上下文错误信息——因此如果整个文本被 [Lexer] 保留,则可以显示带有错误点/区域的源文本中的错误。
通过 [FmtContext] 特质提供对此的支持,该特质特别为 [LexerOfString] 实现。
!