2个不稳定版本
使用旧的Rust 2015
0.4.0 | 2018年3月23日 |
---|---|
0.3.4 | 2018年3月23日 |
0.3.3 |
|
#1914 在 算法
在 3 个crate中使用 (通过 rustlex_codegen)
17KB
319 行
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
迭代器
。
let inp = BufReader::new("aa".as_bytes());
let mut lexer = SimpleLexer::new(inp);
for tok in lexer {
...
}
高级词法分析器功能
标记枚举
默认情况下,rustlex!
假设同一模块中存在一个名为Token
的标记枚举,但这个名称可以根据需要被覆盖,就像OtherLexer
在这个例子中那样。
条件
与flex一样,可以定义条件以使词法分析器从一种模式切换到另一种模式。
查看这个例子。
任意的词法分析器属性和方法
可以使用property
关键字向词法分析器结构中添加特定字段,如此处所示。
词法分析器方法(可以从动作代码中调用)也可以通过一个普通的impl
部分来定义。
依赖项
~145KB