簡體   English   中英

帶有let和加法的表達式的明確語法

[英]Unambiguous grammar for expressions with let and addition

對於具有let加法的表達語言,什么是與以下歧義語法等效的歧義語法?

E⇒讓id = E中的E

E⇒E + E

E⇒數字

應該解決歧義,以便:

  • 加法是關聯的
  • 加法的優先級高於讓表達式在右側出現時的優先級
  • 出現在左側時,加法的優先級低於let表達式

使用花括號顯示子表達式的分組,以下內容說明了如何解釋表達式:

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.

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