【问题标题】:Unambiguous grammar for expressions with let and addition带有 let 和加法的表达式的明确语法
【发布时间】:2019-04-08 20:38:22
【问题描述】:

对于具有 letaddition 的表达式语言,什么是等同于以下歧义语法的明确语法?

E ⇒ 让 id = E in E

E ⇒ E + E

E ⇒ 数字

应该解决歧义,以便:

  • 加法是左关联的
  • add 出现在右边时,其优先级高于 let 表达式
  • add 出现在左侧时,其优先级低于 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 }

【问题讨论】:

    标签: parsing compiler-construction grammar ambiguous-grammar


    【解决方案1】:

    考虑表达式

    E<sub>1</sub> + E<sub>2</sub>

    E<sub>1</sub> 不能具有let ID = E<sub>3</sub> 的形式,因为let ID = E<sub>3</sub> + E<sub>2</sub> 必须被解析为let ID = (E<sub>3</sub> + E<sub>2</sub>)。这个限制是递归的:它也不能有E<sub>4</sub> + let ID = E<sub>3</sub> 的形式。

    E<sub>2</sub> 可以有let ID = E<sub>3</sub> 的形式,但不能有E<sub>3</sub> + E<sub>4</sub> 的形式(因为E<sub>1</sub> + E<sub>3</sub> + E<sub>4</sub> 必须被解析为(E<sub>1</sub> + E<sub>3</sub>) + E<sub>4</sub>)。只有E<sub>1</sub> 可以有E<sub>3</sub> + E<sub>4</sub> 的形式。

    将这些限制转换为 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
    

    可以使用优先声明在野牛(或其他类似的解析器生成器)中实现这一点。但是优先解决方案更难推理,并且在融入更复杂的语法时可能会令人困惑。

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多