Swift 中的自定义运算符

Custom Operators in Swift

众所周知,可以在 Swift 中定义自定义运算符,如下所示:

infix operator +- { associativity left precedence 140 }

Swift Programming Language Specification 告诉我们

New operators are declared at a global level using the operator keyword

我想知道的是 'global level' 和 Swift 编译器如何在语法分析中找出运算符 的意思。 Swift 编译器是否使用需要在使用站点了解这些运算符定义的自定义解析器,或者它是否有一些特殊的 OPERATOR_PRECEDENCE 编译器阶段(或类似的东西)?或者我在这里缺少的完全不同的东西?

我不知道swift是怎么做到的,但没那么难。

一种方法是首先构造一个 AST,其中表达式只是操作数(包括带括号的子表达式)和运算符的列表。一旦初始解析完成并声明运算符,优先级(和固定性,如有必要)可以附加到每个运算符,并重新扫描 AST,使用调车场算法的简化形式将每个表达式列表重建为表达式树.

在Swift的情况下,白色-space似乎用于区分前缀、后缀和中缀运算符(堡垒的阴影!)。我不清楚一旦所有运算符名称都已知,是否需要重新扫描一系列运算符,但我看不到任何其他方法,因为 whitespace 规则不允许前缀运算符(例如)后跟 space 以将其与后面的前缀运算符分开。这并没有使上述算法复杂化多少,因为运算符、操作数和括号不共享任何公共字符。因此,即使不清楚每个运算符令牌从哪里开始,最糟糕的情况是您最终不得不将一个运算符令牌拆分为多个实际运算符。