簡體   English   中英

如何編寫這個“表達式”PEG 語法,使其不是遞歸的,或者我可以使用 prec 爬升器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM