#词法分析 #词法分析器 #分析器 #生成器

nightly rustlex_codegen

RustLex 的语法扩展

2 个不稳定版本

使用旧的 Rust 2015

0.4.0 2018年3月23日
0.3.4 2018年3月23日
0.3.3 2016年5月23日
0.3.2 2015年8月31日
0.3.0 2015年6月15日

#1747 in 开发工具


用于 2 crate

MIT 许可协议

71KB
1.5K SLoC

RustLex: Rust 的词法分析器生成器

警告:RustLex 0.4.0 及更高版本仅适用于 Rust 的 nightly 频道。

如果您想使用 RustLex 与 Rust 的 nightly 频道,请使用版本 0.3.4。注意,syntex 已不再积极维护,尽管此版本提供以保持兼容性,但使用它是不被推荐的。

Build Status

RustLex 是一个词法分析器生成器,即一个程序,它根据使用正则表达式描述的语言生成用于编译器的词法分析器。它与著名的 Lex 类似,但它是用 Rust 编写的,并以 Rust 代码作为分析器输出。它与 Lex 的不同之处在于,它使用 Rust 的新 语法扩展 系统作为定义词法分析器的接口。因此,分析器的描述可以直接嵌入到 Rust 源文件中,并且在宏展开阶段,生成器代码将由 rustc 调用。

RustLex 的可用性和 Rust 兼容性

RustLex 使用语法扩展,它必须处理 rustc libsyntaxlibsyntax 大概是编译器的核心部分,并且已被明确排除在 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