众所周知,可以在Swift中定义自定义操作符如下:
infix operator +- { associativity left precedence 140 }Swift编程语言规范告诉我们
使用operator关键字在全局级别声明新运算符。
我想知道的是,它们所谓的“全局级别”是什么意思,以及编译器是如何在语法分析中找出操作符的。Swift编译器是使用需要在使用站点了解这些操作符定义的自定义解析器,还是有一些特殊的OPERATOR_PRECEDENCE编译器阶段(或类似的内容)?还是我在这里错过的完全不同的东西?
发布于 2015-04-03 04:44:56
我不知道它有多快,但也没那么难。
一种方法是首先构造一个AST,其中表达式只是操作数(包括括号大小的子表达式)和运算符的列表。一旦初始解析完成并声明了操作符,优先级(和固定性,如果必要)可以附加到每个操作符,AST被重新封装,使用分流码算法的简化形式将每个表达式列表重新构建为表达式树。
在Swift的例子中,似乎使用空白来区分前缀、后缀和infix运算符(堡垒的阴影!)。我不清楚一旦知道了所有操作符的名称,是否需要重新设置一个操作符序列,但是我看不到任何其他方法,因为空格规则不允许前缀操作符(例如)后面跟着一个空格,以便将它从后面的前缀操作符中分离出来。这并不会使上述算法复杂化,因为运算符、操作数和括号不共享任何公共字符。因此,即使不清楚每个操作符标记从何处开始,最糟糕的情况也是您最终不得不将一个运算符令牌拆分成几个实际的操作符。
https://stackoverflow.com/questions/29408865
复制相似问题