Swift用Swift编写的AST。 ∞的第5部分
在上一部分中,我介绍了函数声明。 我开始简化AST需求的语法。 使结果类型尽可能易于使用。
在这一部分中,我将介绍枚举声明。 通常,让我们看一下语法部分:
首先,令人惊讶的是,原始值枚举具有特殊的语法。 实际上,这是两个不同的声明。 枚举声明本身只是2之一。
因此,让我们首先对它们进行建模。
联合枚举声明
联合枚举由一个可选的间接修饰符,名称,可选的通用参数,可选的类型继承,可选的通用约束和成员列表组成。 结构,我选择你!
struct UnionEnumDeclaration {
让间接:间接?
命名:标识符
让genericParameters:GenericParameterClause?
让typeInheritance:TypeInheritanceClause?
让genericConstraints:GenericWhereClause?
让成员:[UnionEnumMember]
}
有两种方法可以为indirect
状态建模。 临时的,我选择不是将其建模为bool,而是将其建模为带有单个大小写的可选枚举。
枚举间接{大小写间接}
我希望这将使通过代码构建AST比传递布尔值更加直观。
枚举主体由成员定义数组组成。 枚举内可能有3种成员:
- 正则声明为嵌套类或函数。
- 实际枚举案例
- 用于条件编译等的编译器语句
我将所有情况建模为枚举,让枚举主体建模为枚举:
枚举UnionEnumMember {
case`case`(UnionEnumCaseClause)
案例声明(声明)
案例CompilerControl(CompilerControlStatement)
}
编译器控制语句不在我们的讨论范围内,声明已经在本周期的第二篇文章中定义,因此我们需要关注case子句:
struct UnionEnumCaseClause {
let属性:[Attribute]
让间接:间接?
让案例:[UnionEnumCase]
}
struct UnionEnumCase {
命名:标识符
let类型:TupleType
}
如您所见,我们可以使用单个案例构造声明多个案例,这就是为什么将其建模为实际案例定义的数组。
原始值枚举声明
原始枚举由名称,可选的通用参数,必需的类型继承,可选的通用约束和成员数组组成。 与工会价值非常相似。
我也从未见过带有泛型的Raw枚举。 你知道什么例子吗?
让我们编写这种类型的代码:
struct RawEnumDeclaration {
命名:标识符
让genericParameters:GenericParameterClause?
let typeInheritance:TypeInheritanceClause
让genericConstraints:GenericWhereClause?
让成员:[RawEnumMember]
}
原始成员声明实际上是相同的:
枚举RawEnumMember {
case`case`(RawEnumCaseClause)
案例声明(声明)
案例CompilerControl(CompilerControlStatement)
}
Case子句实际上也相同,唯一的区别是它不能标记为间接的。
struct RawEnumCaseClause {
let属性:[Attribute]
让案例:[RawEnumCase]
}
唯一的案例就是所有差异都存在的地方。 它由名称和可选的原始值组成。 可以为案例分配哪种值是有限制的。 当前是数字,字符串和布尔值。
struct RawEnumCase {
命名:标识符
让rawValue:RawValueLiteral吗?
}
枚举RawValueLiteral {
大小写数字(NumericLiteral)
大小写字符串(StaticStringLiteral)
大小写boolean(BooleanLiteral)
}
最后,当我们声明可能的枚举声明时,我们可以将其包装为单个枚举:
枚举EnumDeclaration {
大小写联合(UnionEnumDeclaration)
案例raw(RawEnumDeclaration)
}