在pess.rs、pest-ast crate 中,如何将struct 映射到嵌套的匿名组?

问题描述

我有一个示例语法:

WHITESPACE = _{ " " }
identifier = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }
int_literal = { DECIMAL_NUMBER+ }
plusminus = { "+" | "-" }
expr = { int_literal ~ (plusminus ~ int_literal)* }
formula = { identifier ~ ":=" ~ expr }
file = { formula ~ EOI }

和一些映射的结构:

    #[derive(Debug,Frompest)]
    #[pest_ast(rule(Rule::int_literal))]
    pub struct IntLiteral {
        #[pest_ast(outer(with(span_into_str),with(str::parse::< i64 >),with(Result::unwrap)))]
        pub value: i64
    }

    #[derive(Debug,Frompest)]
    #[pest_ast(rule(Rule::plusminus))]
    pub struct PlusMinus {
        #[pest_ast(outer(with(span_into_str),with(String::from)))]
        pub op: String,}

    #[derive(Frompest,Debug)]
    #[pest_ast(rule(Rule::expr_tail))]
    pub struct ExprTail {
        pub op: PlusMinus,pub operand: IntLiteral,Debug)]
    #[pest_ast(rule(Rule::expr))]
    pub struct Expr {
        pub head: IntLiteral,pub tail: Vec<ExprTail>,}

问题是,ExprTail 永远不会映射到任何东西,因为 #[pest_ast(rule(???))] 没有命名规则。

如果我将 Expr::tail 设为 Vec<(PlusMinus,IntLiteral)>,它也不起作用。

当然,我可以制定一个明确的语法规则:

...
expr_tail = {plusminus ~ int_literal}
expr = { int_literal ~ expr_tail* }
...

但由于实现限制,我不想用多余的终端来污染语法。

有没有办法将 ExprTail 映射到初始语法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)