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 在 解析工具
698 每月下载
在 8 个crate中使用(7 个直接使用)8 crates (7 directly)
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_pos
和set_buffer_pos
用于回溯,只要扫描器的缓冲区仍然有您需要的数据。这意味着您尚未消耗或丢弃它。