9个版本

0.1.4 2022年3月11日
0.1.3 2021年1月17日
0.1.2 2019年5月1日
0.0.8 2019年2月21日
0.0.4 2016年5月31日

#48解析工具

Download history 70/week @ 2024-03-13 109/week @ 2024-03-20 60/week @ 2024-03-27 66/week @ 2024-04-03 70/week @ 2024-04-10 190/week @ 2024-04-17 153/week @ 2024-04-24 100/week @ 2024-05-01 177/week @ 2024-05-08 203/week @ 2024-05-15 318/week @ 2024-05-22 121/week @ 2024-05-29 125/week @ 2024-06-05 172/week @ 2024-06-12 172/week @ 2024-06-19 202/week @ 2024-06-26

698 每月下载
8 个crate中使用(7 个直接使用)8 crates (7 directly)

MIT 许可证

33KB
864

文档

分词器

此crate基于 Scanner 提供了多个分词器。

  • EbnfTokenizer:对EBNF语法的分词。
let grammar = r#"
    expr   := expr ('+'|'-') term | term ;
    term   := term ('*'|'/') factor | factor ;
    factor := '-' factor | power ;
    power  := ufact '^' factor | ufact ;
    ufact  := ufact '!' | group ;
    group  := num | '(' expr ')' ;
"#;
let mut tok = EbnfTokenizer::new(grammar.chars())
  • LispTokenizer:用于对类似lisp的输入进行分词。
LispTokenizer::new("(+ 3 4 5)".chars());
  • MathTokenizer:发出 MathToken 标记。
MathTokenizer::new("3.4e-2 * sin(x)/(7! % -4)".chars());
  • DelimTokenizer:发出由某些分隔符分割的标记。

扫描器

Scanner 是实现分词器的构建块。您可以从中构建一个迭代器,并使用它来提取标记。请参阅上述分词器示例。

示例

// Define a Tokenizer
struct Tokenizer<I: Iterator<Item=char>>(lexers::Scanner<I>);

impl<I: Iterator<Item=char>> Iterator for Tokenizer<I> {
    type Item = String;
    fn next(&mut self) -> Option<Self::Item> {
        self.0.scan_whitespace();
        self.0.scan_math_op()
            .or_else(|| self.0.scan_number())
            .or_else(|| self.0.scan_identifier())
    }
}

fn tokenizer<I: Iterator<Item=char>>(input: I) -> Tokenizer<I> {
    Tokenizer(lexers::Scanner::new(input))
}

// Use it to tokenize a math expression
let mut lx = tokenizer("3+4*2/-(1-5)^2^3".chars());
let token = lex.next();

提示

  • scan_X 函数尝试从扫描器中消耗一些文本对象。例如数字、标识符、引号字符串等。

  • buffer_posset_buffer_pos 用于回溯,只要扫描器的缓冲区仍然有您需要的数据。这意味着您尚未消耗或丢弃它。

无运行时依赖