1个不稳定版本
0.1.0 | 2020年8月5日 |
---|
#24 在 #dfa
在 enum-lexer 中使用
58KB
1.5K SLoC
枚举词法分析器
一个进程宏词法分析器生成器。使用类似 enum
的语法。
编写词法分析器
#![feature(exclusive_range_pattern)]
use enum_lexer::enum_lexer;
enum_lexer! {
#[derive(Debug, Eq, PartialEq)]
enum lexer {
Ident(String): {
r"[A-Za-z_][A-Za-z_0-9]*" => Ident(text),
}
LitInt(usize): {
r"[0-9][0-9]*" =>
LitInt(text.parse::<usize>()?), // default error type is Box<dyn Error>
}
Op(char): {
r"\+" => Op('+'),
r"\-" => Op('-'),
}
Def: r"def",
Let: r"let",
Group(Vec<Token>, char) : {
r"\(" => {
Group(read_group()?, '(') // construct a token tree within '(', ')'.
}
r"\)" => { panic!("error") }
}
COMMENTS: { // COMMENTS will be ignored
r"//.*?\n" => !,
r"/\*.*?\*/" => !,
}
}
}
这将生成类似于结构和枚举的代码。
mod lexer {
#[derive(Debug, Eq, PartialEq)]
pub struct Token {
pub inner: TokenInner,
pub span: Span,
}
#[derive(Debug, Eq, PartialEq)]
pub enum TokenInner {
Ident(String),
LitInt(usize),
Op(char),
Def,
Let,
Group(Vec<Token>, char),
}
pub struct TokenIterator{...}
pub type LexError = Box<&dyn Error>;
pub fn parse_str(src: &str) -> Result<TokenIterator>;
}
用法
let vec: lexer::Result<Vec<_>> =
lexer::parse_str(r#"
let a = 10 + (1 + 2) // alpha
"#).unwrap().collect();
println!("{:?}", vec);
自定义错误类型
enum_lexer! {
type LexError = MyError;
enum lexer {
LitStr: "\".*?\""
}
}
DFA生成
enum_lexer_test
将生成的DFA写入一个 dfa.dot
文件。
依赖项
~3–12MB
~119K SLoC