4个版本
0.2.1 | 2022年1月13日 |
---|---|
0.2.0 | 2022年1月10日 |
0.1.3 | 2021年11月15日 |
#9 in #lexical-analysis
41KB
724 行
基本的词法分析器,用于解析和编译。
lib.rs
:
basic_lexer是一个基本的词法扫描器,用于编译器的第一阶段,并生成解析器所需的令牌。它最初旨在支持并行项目rustlr,这是一个LR风格的解析器生成器,尽管每个项目都是独立的。
对于0.2.0版本,增加了一个新的“零拷贝”令牌化器,包括[RawToken]、[StrTokenizer]和[LexSource]。最重要的结构是[StrTokenizer]。原始的令牌化和相关构造,它们生成包含所有字符串的令牌,仍然存在。然而,由于它们不是从DFA构建的,所以这两个令牌化器都不是最优性能的。新的令牌化函数StrTokenizer::next_token使用regex,现在成为这个包的重点。它现在可以计算空白字符(用于类似于Python的语言)并准确跟踪每个令牌的起始行/列位置。
示例:给定这个包的Cargo.toml文件,
let source = LexSource::new("Cargo.toml").unwrap();
let mut tokenizer = StrTokenizer::from_source(&source);
tokenizer.set_line_comment("#");
tokenizer.keep_comment=true;
tokenizer.keep_newline=false;
tokenizer.keep_whitespace=false;
while let Some(token) = tokenizer.next() {
println!("Token: {:?}",&token);
}
此代码产生输出
Token: (Symbol("["), 1, 1)
Token: (Alphanum("package"), 1, 2)
Token: (Symbol("]"), 1, 9)
Token: (Alphanum("name"), 2, 1)
Token: (Symbol("="), 2, 6)
Token: (Strlit("\"basic_lexer\""), 2, 8)
Token: (Alphanum("version"), 3, 1)
Token: (Symbol("="), 3, 9)
Token: (Strlit("\"0.2.0\""), 3, 11)
Token: (Alphanum("edition"), 4, 1)
Token: (Symbol("="), 4, 9)
Token: (Strlit("\"2018\""), 4, 11)
...
Token: (Symbol("]"), 8, 35)
Token: (Verbatim("# See more keys and their definitions at https://doc.rust-lang.net.cn/cargo/reference/manifest.html"), 10, 1)
等。与每个令牌一起返回的数字表示令牌起始位置的行和列。
依赖项
~2.1–3MB
~53K SLoC