1 个不稳定版本
0.1.0 | 2024年1月6日 |
---|
#208 in 解析工具
140KB
3.5K SLoC
lrp 解析库的一个易于使用、由编译驱动的接口
直接编写语法很糟糕:处理词法分析器的输入、创建微小的不同规则生成、创建还原表以及其他我们不关心的东西。这个库专注于简化这个过程,你唯一需要的外部东西就是一个像 logos 这样的词法分析器
语法示例
use my_crate::Ast;
use my_crate::Sym::*; // Each module should be imported separetely (there's no { } support yet)
// you can define alias for idents and string literals
alias Number = Number;
alias "+" = Add;
alias "(" = OpenParen;
alias ")" = CloseParen;
Add: Ast = Number:&n1 "+" Number:&n2 -> {
Ast::Add(n1, n2)
}%;
Expr: Ast = Add:&a -> {
/* Meta::new( */
Ast::Expr(a)/*,
Span::new(toks[0].item.span.start, toks.last().unwrap().item.span.end)
)*/
}%
| "(" Expr:&e ")" -> {
Ast::Expr(e)
}%;
EntryPoint: Ast = Expr:&e -> {
Ast::EntryPoint(e)
}%
构建它
对于 Builder
,只需使用 parse
或 from_str
并设置入口类型(标记类型)
let src = include_str!("your.grammar");
let builder1 = src.parse::<wop::Builder>();
let builder2 = wop::Builder::from_str(src);
assert_eq!(builder1, builder2);
使用它
要使用它,只需从 Builder
构建,并调用 builder.dump_grammar()
生成语法的代码
format!("let grammar = Grammar::new(Sym::EntryPoint, {}, Sym::Eof)", builder.dump_grammar(src)) // `src` is the source code for the grammar we used above
并且对于 DFA 构建,请记住导出 reduct_map
format!("parser.dfa(buf, {})", builder.dump_reduct_map(src))
有趣的事实:这个项目使用了它自己。
想法
-
Builder::dump_grammar
// 应该返回一个RuleMap
- 对于组合规则(使用
( x | y)
),代码块将应用于两者 - 实现代码块
- 实现项目别名
- 实现可选项目
- 允许设置自定义切片入口
- 实现项目别名克隆
- 允许自定义标记入口
依赖关系
~3–12MB
~74K SLoC