2 个不稳定版本

0.2.0 2022年9月13日
0.1.0 2022年1月23日

#193 in 解析器工具

Apache-2.0

48KB
1K SLoC

glr

使用 Rust 编写的 GLR 解析器。

crates.io docs.rs

此软件包在需要从依赖于用户输入的上下文无关文法生成解析器时最有用。在其他情况下,可能更适合使用 LALRPOP 软件包。

示例

此示例展示了构建语法解析器的过程

S → S S
S → a
S → ε

并使用它来解析输入字符串 a

use glr::{lalr, Grammar, Parser};
let grammar = Grammar {
    num_symbols: 2,
    nonterminals: &[vec![vec![0, 0], vec![1], Vec::new()]],
};
let table = lalr::Table::new(&grammar);
let (sppf, root) = Parser::new(&grammar, &table)
    .parse([1])
    .ok_or("Failed to parse")?;

// The family of the root node is three alternative lists of children
let family: Vec<_> = root.family(&sppf).collect();
// Either a single `a`;
assert_eq!(family[0][0].symbol(&sppf), Ok(1));
// left-recursion; or
assert_eq!(family[1][0], root);
assert_eq!(family[1][1].symbol(&sppf), Err(&[0][..]));
// right recursion.
assert_eq!(family[2][0].symbol(&sppf), Ok(0));
assert_eq!(family[2][1], root);

可以通过多次展开循环来恢复无限多个推导树中的任意一个。

依赖项

~2MB
~31K SLoC