Swift用Swift编写的AST。 ∞的第4部分
在上一部分中,我讨论了let
和var
declrartions语法。 正如我发现的那样,语法并不能反映语言的所有语法限制。
在这一部分中,我将发现function
声明的结构。 让我们从查看正式的语法定义开始:
单根声明是好的。 它还包含很多子引用,让我们更仔细地研究它们。
首先,让我们尽可能地简化这个定义。 函数头可以用其自己的内容替换,因为其定义中没有任何差异。
其次,可以通过将parameter-clause
建模为[Parameter]
来简化功能签名。 可以将throws
和rethrows
throws
建模为单个可选枚举。
简化之后, function-declaration
可以这样表示:
struct FunctionDeclaration {
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:FunctionName
让genericParamters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsModifier?
让结果:FunctionResult?
let`where`:GenericWhereClause?
让身体:CodeBlock?
}
这里有很多可选的东西。 FunctionName
是第一个额外的定义。 在Swift中,函数可以表示常规方法或运算符主体。 唯一的变化是FunctionName
语法。 和往常一样,我们将其建模为enum
:
枚举FunctionName {
案例标识符(Identifier)
case`operator`(Operator)
}
现在我们将介绍Parameter
定义。 单参数有3种可能的选择。
- 具有默认值
- 具有可变的长度(又称省略号)
- 没有修饰符的最简单形式。
换句话说,我们可以选择使用两个修饰符之一。
struct参数{
让externalName:标识符?
让localName:标识符
let类型:TypeAnnotation
let修饰符:ParameterModifier?
}
枚举ParameterModifier {
大小写默认值(表达式)
省略号
}
因此,对此的最小表示只是本地名称和类型。
对我们来说,下一站是投掷的定义。 函数可以通过throw
或rethrow
声明,也可以不声明。 同样,它看起来像是来自2个选项的可选选项。
枚举ThrowsModifier {
案例`throws`,`rethrows`
}
最后的FunctionDeclaration
是函数结果。 在大多数情况下,它是简单的Type
,但是我们可以为其指定自定义属性(您知道一些示例吗?),因此我将其建模为struct:
struct FunctionResult {
let属性:[Attribute]
让类型:类型
}
而已。
看起来函数声明并不是那么令人恐惧,或者我成为“这方面的专家”©Daddy Pig。