[英]How do I write this `expression` PEG grammar so that it is not recursive, or so that I can use the prec climber?
我正在創建一個可靠的解析器,並且我正在使用 PEST 解析器來處理 rust。 我正在嘗試編寫expression
的語法,但是有很多左遞歸的情況。 我在網上看過,知道你可以使用 prec 登山者,但我不太確定如何實現這一點。 通過按優先級編寫規則或使用 prec 爬升器來刪除左遞歸會更好嗎?
有人可以幫我弄清楚如何實現這個語法,以便它與 PEST 解析器一起工作嗎? 請讓我知道是否有任何可能有助於將內容添加到帖子中的內容。
這是表達式語法
expression = {
(expression ~ LBrack ~ expression? ~ RBrack)
| (expression ~ LBrack ~ expression? ~ Colon ~ expression? ~ RBrack)
| (expression ~ Period ~ (identifier | Address))
| (expression ~ LBrack ~ (namedArgument ~ (Comma ~ namedArgument)*)? ~ RBrack)
| (expression ~ callArgumentList)
| (Payable ~ callArgumentList)
| (Type ~ LParen ~ typeName ~ RParen)
| ((Inc | Dec | Not | BitNot | Delete | Sub) ~ expression)
| (expression ~ (Inc | Dec))
| (expression ~ Exp ~ expression)
| (expression ~ (Mul | Div | Mod) ~ expression)
| (expression ~ (Add | Sub) ~ expression)
| (expression ~ (Shl | Sar | Shr) ~ expression)
| (expression ~ BitAnd ~ expression)
| (expression ~ BitXor ~ expression)
| (expression ~ BitOr ~ expression)
| (expression ~ (LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual) ~ expression)
| (expression ~ (Equal | NotEqual) ~ expression)
| (expression ~ And ~ expression)
| (expression ~ Or ~ expression)
| (expression ~ Conditional ~ expression ~ Colon ~ expression)
| (expression ~ assignOp ~ expression)
| (New ~ typeName)
| (tupleExpression)
| (inlineArrayExpression)
}
你可以嘗試這樣的事情:
expr = { assign }
assign = { conditional ~ ("=" ~ conditional)? }
conditional = { orExpr ~ ("?" ~ orExpr ~ ":" ~ orExpr)? }
orExpr = { andExpr ~ ("||" ~ andExpr)* }
andExpr = { eqExpr ~ ("&&" ~ eqExpr)* }
eqExpr = { relExpr ~ (("==" | "!=") ~ relExpr)? }
relExpr = { bitOrExpr ~ (("<" | "<=" | ">" | ">=") ~ bitOrExpr)? }
bitOrExpr = { bitXorExpr ~ ("|" ~ bitXorExpr)* }
bitXorExpr = { bitAndExpr ~ ("^" ~ bitAndExpr)* }
bitAndExpr = { shiftExpr ~ ("&" ~ shiftExpr)* }
shiftExpr = { addExpr ~ (("<<" | ">>" | ">>>") ~ addExpr)* }
addExpr = { multExpr ~ (("+" | "-") ~ multExpr)* }
multExpr = { expExpr ~ (("*" | "/" | "%") ~ expExpr)* }
expExpr = { incrOrDecr ~ ("^" ~ incrOrDecr)* }
incrOrDecr = { prefix ~ ("++" | "--")? }
prefix = { ("++" | "--" | "!" | "~" | "delete" | "-")? ~ atom }
atom = {
Number
| Id ~ ("." ~ Id)* ~ callArgumentList?
| "(" ~ expr ~ ")"
}
callArgumentList = { "(" ~ (callArgument ~ ("," ~ callArgument)*)? ~ ")" }
callArgument = { expr ~ ((":" | "=") ~ expr)? }
Id = { 'a'..'z'+ }
Number = { '0'..'9'+ }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.