8个版本 (3个稳定版)
1.0.2 | 2020年5月1日 |
---|---|
1.0.1 | 2020年4月30日 |
0.2.0 | 2020年4月29日 |
0.1.3 | 2020年4月29日 |
#21 in #lex
在 char-lex 中使用
7KB
152 行
已停止开发
请随意使用...
CHAR-LEX
Char-Lex
是一个库,用于轻松地从多个自定义枚举中创建基于 char
的词法分析器!
示例
use char_lex::prelude::*;
#[token]
#[derive(Debug, PartialEq)]
enum Token {
Whitespace = [' ', '\t', '\r', '\n'],
Digit(Digit),
}
#[token]
#[derive(Debug, PartialEq)]
enum Digit {
Zero = '0',
One = '1',
Two = '2',
Three = '3',
Four = '4',
Five = '5',
Six = '6',
Seven = '7',
Eight = '8',
Nine = '9',
}
fn main() {
let lexer: Lexer<Token, Token> = Lexer::new("189");
let tokens: Vec<Token> = lexer.collect();
assert_eq!(
vec![
Token::Digit(Digit::One),
Token::Digit(Digit::Eight),
Token::Digit(Digit::Nine)
],
tokens
);
}
具有 TokenTrait
的 Tokens
也可以被包装在任何实现 TokenWrapper<T>
特性的东西中!
示例
#[derive(Debug, PartialEq)]
struct Wrapper {
token: Token,
character: char,
}
impl TokenWrapper<Token> for Wrapper {
fn wrap(token: Token, context: Context) -> Self {
Self {
token,
character: context.character,
}
}
}
fn main() {
let lexer: Lexer<Token, Wrapper> = Lexer::new("1");
let tokens: Vec<Wrapper> = lexer.collect();
assert_eq!(
vec![Wrapper {
token: Token::Digit(Digit::One),
character: '1'
}],
tokens
);
}
依赖项
~1.5MB
~32K SLoC