如何解决在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 举报,一经查实,本站将立刻删除。