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
.
失败时才会检查
我定义了以下 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
.