Parsing 带let和addition的表达式的明确语法

Parsing 带let和addition的表达式的明确语法,parsing,compiler-construction,grammar,ambiguous-grammar,Parsing,Compiler Construction,Grammar,Ambiguous Grammar,对于带有let和addition的表达式语言,什么是与以下歧义语法等价的明确语法 E⇒ 设id=E在E中 E⇒ E+E E⇒ num 应解决歧义,以便: 加法是左联想的 加法出现在右侧时,其优先级高于let表达式 加法出现在左侧时,其优先级低于let表达式 使用大括号显示子表达式的分组,以下说明了应如何解释表达式: num+num+num=>{num+num}+num let id=num in num+num=>let id=num in{num+num} num+let id=num i

对于带有letaddition的表达式语言,什么是与以下歧义语法等价的明确语法

E⇒ 设id=E在E中

E⇒ E+E

E⇒ num

应解决歧义,以便:

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

考虑表达式

E1+E2

E1
不能具有格式
let ID=E3
,因为
let ID=E3+E2
必须解析为
let ID=(E3+E2)
。此限制是递归的:它也不能具有形式
E4+let ID=E3

E2
可以具有形式
let ID=E3
,但不能具有形式
E3+E4
(因为
E1+E3+E4
必须解析为
(E1+E3)+E4
)。只有
E1
可以具有
E3+E4
格式

将这些限制直接(但重复)转化为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(或其他类似的解析器生成器)中实现这一点。但是优先解决方案更难推理,并且在合并到更复杂的语法中时可能会令人困惑