2个版本
0.1.1 | 2023年5月6日 |
---|---|
0.1.0 | 2023年4月14日 |
#161 在 解析工具
320KB
6.5K SLoC
IELR
这是Joel E.Denny和Brian A.Malloy在论文中描述的IELR算法的实现,论文标题为:《The IELR(1) algorithm for generating minimal LR(1) parser tables for non-LR(1) grammars with conflict resolution》。链接:The IELR(1) algorithm for generating minimal LR(1) parser tables for non-LR(1) grammars with conflict resolution。
用法
use ielr::{input, compute_table, Algorithm};
const START_NODE: input::Node = input::Node(0);
let grammar = input::Grammar::new();
// ...
// add grammar productions
// ...
let table = match compute_table(
Algorithm::Lalr(std::num::NonZeroU8::new(1).unwrap()),
&grammar,
[START_NODE],
) {
Ok((table, _statistics)) => table,
Err(_) => unimplemented!("handle error"),
};
更多完整示例,请参阅示例目录。
目的和范围
这个crate旨在由解析生成器使用。它使用高效且最小化的算法为语法构建LR(1)表。
请注意,这个crate不包括:
- 一个词法分析器。
- 实际的解析生成器:一旦有了表,你仍然需要使用它们来构建解析器。
- 一种以文本格式解析语法的途径:语法必须通过代码指定(例如
grammar.add_rule(left, right);
)
未来目标
目前,提供了两种算法:LALR(1)和LR(1)。
将来,我希望实现以下功能:
- 将IELR算法扩展到LR(k)。
- 提高性能,尤其是在使用优先级注释时。