Swift用Swift编写的AST。 ∞的第4部分

在上一部分中,我讨论了letvar declrartions语法。 正如我发现的那样,语法并不能反映语言的所有语法限制。

在这一部分中,我将发现function声明的结构。 让我们从查看正式的语法定义开始:

单根声明是好的。 它还包含很多子引用,让我们更仔细地研究它们。

首先,让我们尽可能地简化这个定义。 函数头可以用其自己的内容替换,因为其定义中没有任何差异。

其次,可以通过将parameter-clause建模为[Parameter]来简化功能签名。 可以将throwsrethrows throws建模为单个可选枚举。

简化之后, function-declaration可以这样表示:

  struct FunctionDeclaration { 
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:FunctionName
让genericParamters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsMo​​difier?
让结果:FunctionResult?
let`where`:GenericWhereClause?
让身体:CodeBlock?
}

这里有很多可选的东西。 FunctionName是第一个额外的定义。 在Swift中,函数可以表示常规方法或运算符主体。 唯一的变化是FunctionName语法。 和往常一样,我们将其建模为enum

 枚举FunctionName { 
案例标识符(Identifier)
case`operator`(Operator)
}

现在我们将介绍Parameter定义。 单参数有3种可能的选择。

  1. 具有默认值
  2. 具有可变的长度(又称省略号)
  3. 没有修饰符的最简单形式。

换句话说,我们可以选择使用两个修饰符之一。

  struct参数{ 
让externalName:标识符?
让localName:标识符
let类型:TypeAnnotation
let修饰符:ParameterModifier?
}
 枚举ParameterModifier { 
大小写默认值(表达式)
省略号
}

因此,对此的最小表示只是本地名称和类型。

对我们来说,下一站是投掷的定义。 函数可以通过throwrethrow声明,也可以不声明。 同样,它看起来像是来自2个选项的可选选项。

 枚举ThrowsMo​​difier { 
案例`throws`,`rethrows`
}

最后的FunctionDeclaration是函数结果。 在大多数情况下,它是简单的Type ,但是我们可以为其指定自定义属性(您知道一些示例吗?),因此我将其建模为struct:

  struct FunctionResult { 
let属性:[Attribute]
让类型:类型
}

而已。

看起来函数声明并不是那么令人恐惧,或者我成为“这方面的专家”©Daddy Pig。