#tokenizer #scanner #token #lexical-analysis #basic #compiling #analyzer

basic_lexer

基本的词法分析器,用于解析和编译

4个版本

0.2.1 2022年1月13日
0.2.0 2022年1月10日
0.1.3 2021年11月15日

#9 in #lexical-analysis

MIT许可证

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