2个版本

0.1.1 2023年5月6日
0.1.0 2023年4月14日

#161解析工具

MPL-2.0 许可证

320KB
6.5K SLoC

IELR

License: MPL 2.0 Latest Version Docs Status

这是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)。
  • 提高性能,尤其是在使用优先级注释时。

依赖