PEG语法解析,当表达式以负数开头时出错

PEG Grammar Parsing, error when expression starts with negative number

我定义了以下 PEG 语法:

Program = _{ SOI ~ Expr ~ EOF }

Expr = { UnaryExpr | BinaryExpr }

Term = _{Int | "(" ~ Expr ~ ")" }

UnaryExpr = { Operator ~ Term }

BinaryExpr = { Term ~ (Operator ~ Term)* }

Operator = { "+" | "-" | "*" | "^" }

Int = @{ Operator? ~ ASCII_DIGIT+ }

WHITESPACE = _{ " " | "\t" }

EOF = _{ EOI | ";" }

并且以下表达式都被正确解析:

1 + 2   
1 - 2    
1 + -2   
1 - -2   
1        
+1       
-1

但是以负数开头的任何表达式都会出错

-1 + 2

错误

  --> 1:4
  |
1 | -1 + 2
  |    ^---
  |
  = expected EOI

我期望(我想要的)-1 + 2 被视为与 1 + -2 相同,即由两个一元表达式组成的二元表达式。

我试过很多变体,但都没有成功。而且,如果需要的话,我愿意使用完全不同的范例,但我真的很想保留 UnaryExpression 的想法,因为我已经围绕它构建了我的解析器。

我是 PEG 新手,非常感谢任何帮助。

为了它的价值,我正在使用 Rust v1.59 和 https://pest.rs/ 来解析和测试我的表达式。

你的 Expr 逻辑有一个小错误。如果两者匹配,| 之前的第一部分优先。 并且 -1 是一个有效的 UnaryExpr,因此在这种情况下,整个程序应该匹配 SOI ~ UnaryExpr ~ EOF。但是有额外的数据(+ 2)导致了这个错误。

如果您反转 Expr 的可能性,那么 Expr = { BinaryExpr | UnaryExpr } 该示例就可以工作。这样做的原因是第一个 BinaryExpr 将被检查,并且只有在 UnaryExpr.

失败时才会检查