#ast #lalrpop #parameters #lr #reference #zypo #ast-parser

zypo-parser

zypo-rs的参考解析器,使用LALRPOP进行LR(1)解析

1个不稳定版本

0.0.1 2019年10月3日

#10#lalrpop

MIT 许可证

10KB
101

关于

zypo-parserzypo-rs 参考编译器的主要解析器实现。本包使用了 LALRPOP 库,这是一个类似 yacc 的 Rust 的 LR(1) 解析器组合器。此包还包含了 Zypo 的 AST(抽象语法树)以及所有公共 AST 结构,枚举和相关函数都在此包的基础级别。

请注意,此包正在积极开发中,并且作为子包与主 Zypo 编译器一起开发。如果您正在寻找基础 zypo-rs 编译器,您可能在这里找到它 [链接].

示例

解析 AST 的快捷方式或在任何给定输入中发生错误时引发恐慌

use zypo_parser::{
    Function,
    VarType,
    Parameter,
    ast_result
}; // All but ast_result are from the AST. ast_result is the shortcut func

fn main() {
    let input = "fun shortcut_test_func(my_param: int) {}";
    let expected = vec![
        Function {
            ident: "shortcut_test_func".to_string(),
            params: vec![
                Parameter { ident: "my_param".to_string(), ty: VarType::Int }
            ],
            body: vec![],
            return_type: VarType::Void
        }
    ];

    assert_eq!(ast_result(input), expected);
}

更可控但更底层的 LALRPOP 绑定,用于手动处理生成的解析错误

use zypo_parser::{
    Function,
    VarType,
    parser
}; // Function and VarType are from the AST, parser is generated by LALRPOP

fn main() {
    let input = "fun test_func() {}";
    let expected = vec![
        Function {
            ident: "test_func".to_string(),
            params: vec![],
            body: vec![],
            return_type: VarType::Void
        }
    ];

    assert_eq!(parser::GrammarParser::new().parse(input).unwrap(), expected);
}

依赖项

~2.2–4MB
~70K SLoC