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

在上一部分中,我介绍了struct和class声明。 在这一部分中,我将描述Swift语言的另一个基本支柱:协议。

通常,让我们从语法开始:

好吧,看起来就像是类和结构。 但是,它不允许在协议内部定义任何声明,而只限于几种严格的情况。

让我们为该语法编写代码。

  struct ProtocolDeclaration { 
let属性:[Attribute]
让accessLevel:AccessLevelModifier?
命名:标识符
让typeInheritance:TypeInheritanceClause?
让成员:[ProtocolMember]
}
 枚举ProtocolMember { 
案例var(ProtocolPropertyDeclaration)
案例`func`(ProtocolMethodDeclaration)
案例`init`(ProtocolInitializerDeclaration)
案例`subscript'(ProtocolSubscriptDeclaration)
案例`associatedtype`(ProtocolAssociatedTypeDeclaration)
case`typealias`(TypealiasDeclaration)
 案例editorStatement(CompilerControlStatement) 
}

属性

这是var声明的简化版本。 使用struct对其建模应该非常容易:

  struct ProtocolPropertyDeclaration { 
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:标识符
let类型:TypeAnnotation
让getter:GetterKeywordClause
让setter:SetterKeywordClause?
}

有趣的是,此精确声明与常规var声明的一部分匹配。 这可能是Swift语法中有些技术欠佳的迹象。

方法

  struct ProtocolMethodDeclaration { 
let属性:[Attribute]
let修饰符:[DeclarationModifier]
命名:标识符
让genericParameters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsMo​​difier?
让结果:FunctionResult?
let`where`:GenericWhereClause?
}

再一次。 这看起来与常规func声明完全一样,但是没有主体代码块。 在func声明中,我们有可选的body块。 语法中技术债务的另一个迹象。 看起来很长一段时间的协议是由常规定义组成的。 后来-引入了特殊的语法版本。

初始化器

  struct ProtocolInitializerDeclaration { 
let属性:[Attribute]
let修饰符:[DeclarationModifier]
让optionalModifier:InitializerOptionalKind?
让genericParamters:GenericParameterClause?
让参数:[参数]
让throwBehavior:ThrowsMo​​difier?
let`where`:GenericWhereClause?
}

这部分还镜像了没有主体的默认init声明。 我将在下一部分介绍init,但是模式是相同的。

下标

  struct ProtocolSubscriptDeclaration { 
let属性:[Attribute]
let修饰符:[DeclarationModifier]
让参数:[参数]
让结果:FunctionResult
让getter:GetterKeywordClause
让setter:SetterKeywordClause
}

看起来很像一个函数,但是没有名称(它总是subscript

关联类型

  struct ProtocolAssociatedTypeDeclaration { 
let属性:[Attribute]
让accessModifier:AccessLevelModifier?
命名:标识符
让typeInheritance:TypeInheritanceClause?
让类型:类型?
}

关联类型是类型声明的一种特殊形式,其中类型分配是可选的。 但是他们从原始的typealias声明中使用了很多语法。