我定義了以下 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/來決議和測驗我的運算式。
uj5u.com熱心網友回復:
你在Expr邏輯上有一個小錯誤。如果兩者都匹配,則前面的第一部分|優先。并且-1是有效的,因此在這種情況下,UnaryExpr整個程式都應該匹配。SOI ~ UnaryExpr ~ EOF但是有額外的資料 ( 2) 會導致這個錯誤。
如果您反轉 的可能性,Expr以便Expr = { BinaryExpr | UnaryExpr }示例有效。這樣做的原因是 firstBinaryExpr將被檢查,并且只有在失敗時才會被檢查UnaryExpr。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446027.html
上一篇:與在SQL客戶端中運行相同的查詢相比,PHP查詢回傳的結果正好少1個
下一篇:在python中,在行中查找標記
