2 个不稳定版本
使用旧的 Rust 2015
0.4.0 | 2018年3月23日 |
---|---|
0.3.4 | 2018年3月23日 |
0.3.3 |
|
0.3.2 |
|
0.3.0 |
|
#1747 in 开发工具
用于 2 crate
71KB
1.5K SLoC
RustLex: Rust 的词法分析器生成器
警告:RustLex 0.4.0 及更高版本仅适用于 Rust 的 nightly 频道。
如果您想使用 RustLex 与 Rust 的 nightly 频道,请使用版本 0.3.4。注意,syntex 已不再积极维护,尽管此版本提供以保持兼容性,但使用它是不被推荐的。
RustLex 是一个词法分析器生成器,即一个程序,它根据使用正则表达式描述的语言生成用于编译器的词法分析器。它与著名的 Lex 类似,但它是用 Rust 编写的,并以 Rust 代码作为分析器输出。它与 Lex 的不同之处在于,它使用 Rust 的新 语法扩展 系统作为定义词法分析器的接口。因此,分析器的描述可以直接嵌入到 Rust 源文件中,并且在宏展开阶段,生成器代码将由 rustc
调用。
RustLex 的可用性和 Rust 兼容性
RustLex 使用语法扩展,它必须处理 rustc libsyntax
。 libsyntax
大概是编译器的核心部分,并且已被明确排除在 Rust 1.0 路线图中。总之,RustLex 内联语法生成在 Rust 稳定版中不可用。
使用 Rust nightly,只需在 Cargo.toml 中指出对 rustlex
的依赖,并在 crate 的顶部添加以下行
#![feature(plugin)]
#![plugin(rustlex)]
#[allow(plugin_as_library)] extern crate rustlex;
这将使 rustc
加载包含生成代码所需一切内容的 RustLex 插件。
定义词法分析器
然后您可以在任何地方调用 rustlex!
宏。该宏将展开为一个单一的词法分析器结构和实现,描述词法分析器。
rustlex!
宏接受结构体名称和词法分析器的描述作为参数。描述由两部分组成:
- 正则表达式定义
- 规则定义
最简单的词法分析器可能看起来像:
rustlex! SimpleLexer {
// expression definitions
let A = 'a';
// then rules
A => |lexer:&mut SimpleLexer<R>| Some(TokA ( lexer.yystr() ))
}
更复杂的正则表达式定义示例可以在这里找到。值得注意的是
- 字符(独立或字符类中)和字符串必须像Rust或C中那样进行引用(字符使用简单引号,字符串使用双引号)
- 表达式定义可以通过其在另一个表达式中的标识符来“调用”
使用词法分析器
词法分析器将从标准的Rust Reader
读取字符并实现一个 Token
iterator
。
let inp = BufReader::new("aa".as_bytes());
let mut lexer = SimpleLexer::new(inp);
for tok in lexer {
...
}
高级词法分析器功能
令牌枚举
默认情况下,rustlex!
假设同一个模块中存在一个名为 Token
的令牌枚举,但这个名称可以在需要时被覆盖,就像这个例子中的 OtherLexer
一样。
条件
与flex一样,可以定义条件使词法分析器在不同的模式之间切换。
请参考这个示例。
任意的词法分析器属性和方法
可以使用 property
关键字向词法分析器结构体添加特定字段,如这里所示。
词法分析器方法(从操作代码中调用)也可以通过一个正常的 impl
部分来定义。
依赖关系
~290KB