【发布时间】:2013-02-16 16:47:03
【问题描述】:
我正在尝试为处理 lambda 演算的语言编写一个小型编译器。这是我发现的语言的模棱两可的定义:
E → ^ v . E | E E | ( E ) | v
符号 ^, ., (, ) 和 v 是记号。 ^ 表示 lambda,v 表示变量。 ^v.E 形式的表达式是函数定义,其中 v 是函数的形参,E 是函数体。如果 f 和 g 是 lambda 表达式,则 lambda 表达式 fg 表示函数 f 对参数 g 的应用。
我正在尝试为这种语言编写一个明确的语法,假设函数应用程序是左关联的,例如 fgh = (fg)h,并且函数应用程序的绑定比 . 更紧密,例如 (^x. ^y.xy) ^zz = (^x.(^y.xy)) ^zz
这是我目前所拥有的,但我不确定它是否正确:
E -> ^v.E | T
T -> vF | (E) E
F -> v | epsilon
有人可以帮忙吗?
【问题讨论】:
-
1) 明确的语法不是万能的。
-
2) 为什么要手动而不是使用(免费)语法工具,其中许多工具可以在网络上免费获得?
-
介意给我指一个好的吗?我对此很陌生。
-
irony.codeplex.com 易于学习。
-
@Pieter 出于许多实际目的,语法必须是明确的。更多的解析树会产生不止一种解释,这在翻译口语时可能没问题,但这不是常态。
标签: parsing lambda programming-languages grammar lambda-calculus