在仓颉语言的编译过程中,首先通过词法分析将代码转换成 Tokens,然后对 Tokens 进行语法解析,得到一个语法树。每个语法树的节点可能是一个表达式、声明、类型、模式等。仓颉 ast 库提供了每种节点对应的类,它们之间具有适当的继承关系。其中,主要的抽象类如下:
- Node:所有语法节点的父类
- TypeNode:所有类型节点的父类
- Expr:所有表达式节点的父类
- Decl:所有声明节点的父类
- Pattern:所有模式节点的父类
具体节点的类型众多,具体细节请参考 《仓颉编程语言库 API》文档。在下面的案例中,我们主要使用以下节点:
- BinaryExpr:二元运算表达式
- FuncDecl:函数的声明
节点的解析
通过 ast 库,基本上每种节点都可以从 Tokens 解析。有两种调用解析的方法。
使用解析表达式和声明的函数。
以下函数用于从 Tokens 解析任意的表达式或任意的声明:
- parseExpr(input: Tokens): Expr:将输入的 Tokens 解析为表达式
- parseExprFragment(input: Tokens, startFrom!: Int64 = 0): (Expr, Int64):将输入 Tokens 的一个片段解析为表达式,片段从 startFrom 索引开始,解析可能只消耗从索引 startFrom 开始的片段的一部分,并返回第一个未被消耗的 Token 的索引(如果消耗了整个片段,返回值为 input.size)
- parseDecl(input: Tokens, astKind!: String = ""):将输入的 Tokens 解析为声明,astKind 为额外的设置,具体请见《仓颉编程语言库 API》文档。
- parseDeclFragment(input: Tokens, startFrom!: Int64 = 0): (Decl, Int64):将输入 Tokens 的一个片段解析为声明,startFrom 参数和返回索引的含义和 parseExpr 相同。