【发布时间】:2015-04-07 05:40:34
【问题描述】:
在编译的哪个阶段(扫描、解析、语义分析的某些部分,甚至可能 代码生成)是通常处理的语法糖,是如何处理的,原因是什么?
【问题讨论】:
-
根据语言的不同,语法糖通常在源代码本身中实现 - 即在编译器链之外。一个非常流行的例子是 jQuery,它在 javascript 本身中引入语法糖作为库 - 不需要用户重新编译他们的网络浏览器。
-
其他很容易直接用语言本身实现语法糖的语言包括lisp(Scheme等)和tcl。一个极端的例子是 lisp 和 tcl 中的面向对象编程特性最初是直接用该语言实现的,不需要对编译器/解析器进行任何修改
-
@slebetman - 考虑到可能需要去糖以及源代码必须经过所有编译器阶段这一事实,您是否建议执行源代码内替换?无论如何,调试将如何工作?我无法想象。
-
不是源内替换。糖只是功能。碰巧某些语言的语法是如此之少,以至于函数调用看起来像语法
-
是的。例如,在 tcl 中,没有表达式——只有函数调用(想象一下 bash 或 dos,你就会理解 tcl 语法)。因此,数组语法可以很容易地实现为如下所示的函数:
proc Array {vector_string operand value} {...},您现在可以输入Array [i,j] = value。您甚至可以使用称为unknown函数的功能来消除Array和[]之间的空白,每当您尝试调用未定义的函数时都会调用该功能。
标签: compiler-construction language-agnostic programming-languages language-features language-translation