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

在上一部分中,我介绍了enum声明,并发现迅速地存在两个不同的枚举。

在这一篇中,我将一次涵盖两个实体: strucclass 。 它们彼此非常相似。 但是在运行时担任不同的角色。

结构

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

前面的部分已经介绍了很多此类字段,因此我们应该使用乐高积木来构建它。 我们将展平此类型,并用struct-member数组替换struct-body

  struct StructDeclaration { 
let属性:[Attribute]
让accessLevel:AccessLevelModifier?
命名:标识符
让genericParameters:GenericParameterClause?
让typeInheritance:TypeInheritanceClause?
让genericConstraints:GenericWhereClause?
让成员:[StructMember]
}
 枚举StructMember { 
案例声明(声明)
案例editorStatement(CompilerControlStatement)
}

作为struct的成员,我们可以具有一些声明或某些编译器指令。

类语法非常相似:

struct选项的主要区别只是添加了final指令。 它可以在访问级别修饰符之后或之前。 因此,有两个类声明。 我们将跳过此差异,并始终假定final只能在访问级别修改器之后才能进行。

  struct ClassDeclaration { 
let属性:[Attribute]
让accessLevel:AccessLevelModifier?
让final:final?
命名:标识符
让genericParameters:GenericParameterClause?
让typeInheritance:TypeInheritanceClause?
让genericConstraints:GenericWhereClause?
让成员:[ClassMember]
}
 枚举Final {case final} 
 枚举ClassMember { 
案例声明(声明)
案例editorStatement(CompilerControlStatement)
}

如我们所见,类和结构在语法方面非常相似。 但是,有一件事对我来说看起来很奇怪。 open是另一个访问级别修饰符,与final相反,因此,根据语法,我可以编写open struct ...open final class 。 没事)