2 个不稳定版本
使用旧的 Rust 2015
0.4.0 | 2018年3月23日 |
---|---|
0.3.3 |
|
0.3.2 |
|
0.3.0 |
|
0.2.2 |
|
722 在 开发工具 中
52 每月下载量
在 rumblebars 中使用
60KB
1K 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
部分定义。
依赖关系
~325KB