[英]Unambiguous grammar for expressions with let and addition
對於具有let和加法的表達語言,什么是與以下歧義語法等效的歧義語法?
E⇒讓id = E中的E
E⇒E + E
E⇒數字
應該解決歧義,以便:
使用花括號顯示子表達式的分組,以下內容說明了如何解釋表達式:
num + num + num
=> { num + num } + num
let id = num in num + num
=> let id = num in { num + num }
num + let id = num in num
=> num + { let id = num in num }
考慮表達
E 1 + E 2
E 1
不能具有let ID = E 3
的形式,因為必須將let ID = E 3 + E 2
解析為let ID = (E 3 + E 2 )
。 此限制是遞歸的:它也不能具有E 4 + let ID = E 3
。
E 2
可以具有let ID = E 3
的形式,但不能具有E 3 + E 4
的形式(因為必須將E 1 + E 3 + E 4
解析為(E 1 + E 3 ) + E 4
)。 只有E 1
可以具有E 3 + E 4
的形式。
將這些限制轉換為BNF很簡單(但重復):
Expr ⇒ Sum
Sum ⇒ SumNoLet '+' Atom
| Atom
SumNoLet ⇒ SumNoLet '+' AtomNoLet
| AtomNoLet
AtomNoLet ⇒ num
| id
| '(' Expr ')'
Atom ⇒ AtomNoLet
| 'let' id '=' Expr
為了使模式更清晰,我們可以添加*
運算符:
Expr ⇒ Sum
Sum ⇒ SumNoLet '+' Prod
| Prod
SumNoLet ⇒ SumNoLet '+' ProdNoLet
| ProdNoLet
Prod ⇒ ProdNoLet '*' Atom
| Atom
ProdNoLet ⇒ ProdNoLet '*' AtomNoLet
| AtomNoLet
AtomNoLet ⇒ num
| id
| '(' Expr ')'
Atom ⇒ AtomNoLet
| 'let' id '=' Expr
可以使用優先級聲明在bison(或其他類似的解析器生成器)中實現此功能。 但是優先級解決方案較難推論,並且可能難以合並到更復雜的語法中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.