#lexical #token-parser #text-parser #parser #text

lexer-rs

用于将无上下文文本解析成标记的词法分析器框架

3 个版本

0.0.4 2024年1月2日
0.0.3 2023年10月2日
0.0.2 2022年9月22日

#51解析工具


用于 hml-rs

MIT/Apache

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] 实现。

!

依赖项