问题描述
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 (将#修改为@)