V抽象语法树

V语言所有的语法树结构体都在标准库的v.ast模块中定义,主要是通过联合类型来实现。

用联合类型来实现语法树,代码显得非常的简洁,清晰。

v ast子命令

可使用v ast子命令来生成语法树结构,这样你就可以边写代码,边查看代码对应的语法树,有助于加深对V语言语法树的理解。

v ast main.v       //生成json格式的AST语法树文件main.json
v ast -w main.v    //生成main.json,并且监控源文件变化,保存后自动重新生成
v ast -c main.v    //同时生成AST语法树文件main.json和C源代码main.c,并监控源文件变化,保存后自动重新生成
v ast -p main.v    //直接在终端中输出AST语法树
v ast -t main.v    //输出简洁版的AST语法树文件main.json[]

使用v ast子命令,将本章节中的示例代码生成语法树,即可查看到各种不同代码对应的语法树。

语法树结构体总览

ast.File语法树文件

整个编译过程主要的步骤就是: [ ]os.File => [ ]ast.File => 目标代码(c/x64/js) => 可执行文件。

一个os.File(源代码文件)会生成一个对应的ast.File(语法树文件)。

AST结构体

示例代码

生成的AST,整个源文件的所有语句都保存在stmts语句数组节点中:

Module 模块

AST结构体

示例代码

Const 常量

AST结构体

示例代码

Enum 枚举

示例代码

Variable 变量

Assign 变量赋值语句

AST结构体

示例代码

Identifier 标识符

AST结构体

示例代码

Literal 字面量

AST结构体

示例代码

AsCast as造型语句

AST结构体

示例代码

SizeOf sizeof语句

AST结构体

示例代码

TypeOf typeof语句

AST结构体

示例代码

CastExpr 造型表达式

AST结构体

示例代码 ( todo: need more about string(buf,n) )

Array 数组

ArrayInit 数组初始化语句

AST结构体

示例代码

IndexExpr 索引表达式

AST结构体

示例代码

RangeExpr 数组区间表达式

AST结构体

示例代码

ArrayDecompose 数组解构

AST结构体

示例代码

Map 字典

MapInit 字典初始化

AST结构体

示例代码

Operator 操作符

PrefixExpr 前缀表达式

AST结构体

示例代码

InfixExpr 中缀表达式

AST结构体

示例代码

PostfixExpr 后缀表达式

AST结构体

示例代码

SelectorExpr 选择器表达式

AST结构体

示例代码

ParExpr 括号表达式

AST结构体

示例代码

ConcatExpr 连接表达式

AST结构体

示例代码

Function 函数

FnDecl 函数声明

AST结构体

示例代码

AnonFn 匿名函数

AST结构体

示例代码

DeferStmt 函数defer语句

AST结构体

示例代码

Struct 结构体

StructDecl 结构体声明语句

AST结构体

示例代码

示例代码

StructInit 结构体初始化表达式

AST结构体

示例代码

结构体初始化例子

Interface 接口

InterfaceDecl 接口声明语句

AST结构体

示例代码

Type 类型

AliasType 类型别名声明语句

AST结构体

示例代码

FunctionType 函数类型声明语句

AST结构体

示例代码

Sumtype 联合类型

AST结构体

示例代码

TypeNode 类型表达式

主要用于联合类型的match类型匹配,以及is类型判断

AST结构体

示例代码

FlowControl 流程控制

Block 代码块语句

AST结构体

示例代码

if 条件语句

AST结构体

示例代码

match 分支匹配

AST结构体

示例代码

for 循环语句

AST结构体

示例代码

示例代码

示例代码

goto 跳转语句

AST结构体

示例代码

Error handle 错误控制

AST结构体

示例代码

Concurrent 并发

ChanInit 通道初始化

AST结构体

示例代码

SelectExpr 通道监听表达式

AST结构体

示例代码

LockExpr 并发锁表达式

AST结构体

示例代码

GoExpr 并发表达式

AST结构体

示例代码

Unsafe 不安全代码

AST结构体

示例代码

ASM 汇编

AST结构体

示例代码

SQL SQL语句

AST结构体

示例代码

TestAssert 测试断言

AssertStmt 测试断言语句

AST结构体

示例代码

DumpExpr 转储函数表达式

AST结构体

示例代码

Compile time 编译时

CompFor 编译时循环语句

AST结构体

示例代码

AtExpr at全局常量表达式

AST结构体

示例代码

C Integration C代码互操作

GlobalDecl 全局变量声明

AST结构体

示例代码

HashStmt C宏指令语句

AST结构体

示例代码

Likely likely表达式

AST结构体

示例代码

OffsetOf 结构体字段内存偏移量

AST结构体

示例代码

Comment 注释

AST结构体

示例代码

Other 其他

Empty 空语句/表达式

只在编译内部使用,用来判断空语句和空表达式。

AST结构体

NodeError 错误节点

只在编译内部使用,当解析器报错时,返回NodeError节点。

NodeError既是语句,也是表达式。

最后更新于

这有帮助吗?