Parsing 带let和addition的表达式的明确语法
对于带有let和addition的表达式语言,什么是与以下歧义语法等价的明确语法 E⇒ 设id=E在E中 E⇒ E+E E⇒ num 应解决歧义,以便: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
- 加法是左联想的
- 加法出现在右侧时,其优先级高于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(或其他类似的解析器生成器)中实现这一点。但是优先解决方案更难推理,并且在合并到更复杂的语法中时可能会令人困惑