实现糖语法

Implementing sugar syntax

提问人:sjaustirni 提问时间:4/7/2015 更新时间:4/7/2015 访问量:167

问:

在编译的哪个阶段(扫描、解析、语义分析的某些部分,甚至可能 代码生成)通常处理语法糖,如何以及原因是什么?

编译器-构造 不可知 编程- 功能 语言-翻译

评论

0赞 slebetman 4/7/2015
根据语言的不同,语法糖通常在源代码本身中实现,即在编译器链之外。一个非常流行的例子是 jQuery,它在 javascript 本身中引入了语法糖作为库 - 不需要用户重新编译他们的 Web 浏览器。
0赞 slebetman 4/7/2015
其他非常容易直接在语言本身中实现语法糖的语言包括 lisp(Scheme 等)和 tcl。一个极端的例子是 lisp 和 tcl 中的面向对象编程功能最初是直接在语言中实现的,不需要对编译器/解析器进行任何修改
0赞 sjaustirni 4/7/2015
@slebetman - 考虑到可能需要脱糖,以及源代码无论如何都必须经过所有编译器阶段的事实,您是否建议执行源代码内替换?无论如何,调试将如何工作?我无法想象。
0赞 slebetman 4/7/2015
不是源内替换。糖只是功能。碰巧的是,某些语言的语法非常少,以至于函数调用看起来像语法
1赞 slebetman 4/7/2015
是的。例如,在 tcl 中,没有表达式 - 只有函数调用(想象一下 bash 或 dos,你就会理解 tcl 语法)。因此,Array 语法可以很容易地实现为如下所示的函数: 您现在可以键入 .您甚至可以通过使用称为函数的功能来消除该函数之间的空格,该功能会在您尝试调用未定义的函数时被调用。proc Array {vector_string operand value} {...}Array [i,j] = valueArray[]unknown

答:

3赞 rici 4/7/2015 #1

最容易做到的通常是在构建 AST 的时候——即在解析过程中——因为这会使脱糖变得明显和可验证,此后在语义分析和代码生成过程中不需要以任何方式处理糖。

这是一个非常笼统的准则,在无数情况下,您可能会选择不同的策略。