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

在上一部分中,我介绍了函数声明。 我开始简化AST需求的语法。 使结果类型尽可能易于使用。

在这一部分中,我将介绍枚举声明。 通常,让我们看一下语法部分:

首先,令人惊讶的是,原始值枚举具有特殊的语法。 实际上,这是两个不同的声明。 枚举声明本身只是2之一。

因此,让我们首先对它们进行建模。

联合枚举声明

联合枚举由一个可选的间接修饰符,名称,可选的通用参数,可选的类型继承,可选的通用约束和成员列表组成。 结构,我选择你!

  struct UnionEnumDeclaration { 
让间接:间接?
命名:标识符
让genericParameters:GenericParameterClause?
让typeInheritance:TypeInheritanceClause?
让genericConstraints:GenericWhereClause?
让成员:[UnionEnumMember]
}

有两种方法可以为indirect状态建模。 临时的,我选择不是将其建模为bool,而是将其建模为带有单个大小写的可选枚举。

 枚举间接{大小写间接} 

我希望这将使通过代码构建AST比传递布尔值更加直观。

枚举主体由成员定义数组组成。 枚举内可能有3种成员:

  1. 正则声明为嵌套类或函数。
  2. 实际枚举案例
  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)
}