带有let和加法的表达式的明确语法

时间:2018-11-05 13:17:24

标签: parsing compiler-construction grammar ambiguous-grammar

对于具有 let addition 的表达式语言,什么是与以下歧义语法等效的歧义语法?

E⇒让id = E中的E

E⇒E + E

E⇒数字

应该解决歧义,以便:

  • 添加保持关联
  • 加法出现在右侧时,其优先级高于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 }

1 个答案:

答案 0 :(得分:2)

考虑表达式

ggplot(mydata) + stat_density(geom="line",size=0.8, position = "identity", aes(x=value, color=from)) + scale_colour_manual(name="Type", values=colo) + theme_bw()

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

将这些限制转换为BNF是直截了当(但重复)的:

E3 + E4

要使模式更清晰,我们可以添加Expr ⇒ Sum Sum ⇒ SumNoLet '+' Atom | Atom SumNoLet ⇒ SumNoLet '+' AtomNoLet | AtomNoLet AtomNoLet ⇒ num | id | '(' Expr ')' Atom ⇒ AtomNoLet | 'let' id '=' Expr 运算符:

*

可以使用优先级声明在bison(或其他类似的解析器生成器)中实现此功能。但是,优先级解决方案很难推理,并且可能难以融入更复杂的语法中。