1 个不稳定版本

0.1.0 2024年1月6日

#208 in 解析工具

MIT 许可证

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,只需使用 parsefrom_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