提交 f1a02f30 编写于 作者: chai2010's avatar chai2010

开始建立 wat 子包

上级 ab797adf
// 版权 @2023 凹语言 作者。保留所有权利。
package wat
// Module 表示一个 WASM 模块。
type Module struct {
Doc string // 注释
Name string // 模块的名字(可空)
InitFn string // 初始化函数
MainFn string // 开始函数名字(可空)
Memory *Memory // 内存对象, 包含 Data 信息(可空)
Table *Table // 表格对象, 包含 Elem 信息(可空)
Globals []Global // 全局对象
Funcs []Func // 函数对象
}
// 内存信息
type Memory struct {
Doc string // 注释
Name string // 内存对象的名字
ImportPath []string // 导入路径(仅针对导入对象)
ExportName string // 导出名字
Pages int // 页数, 每页 64 KB
Data []DataSection // 初始化数据, 可能重叠
}
// 初始化数据
type DataSection struct {
Doc string // 注释
Name string // 名字
Offset uint32 // 偏移量(0 表示自动计算)
Value []byte // 初始化值
}
// Table 信息
type Table struct {
Doc string // 注释
Name string // Table对象的名字
ImportPath []string // 导入路径(仅针对导入对象)
ExportName string // 导出名字
Size int // 表格容量
Type string // 元素类型, 默认为 anyfunc
Elem []ElemSection // 初始化数据
}
// 表格元素数据
type ElemSection struct {
Doc string // 注释
Offset uint32 // 偏移量(从 0 开始)
Value string // 初始化值, 引用的是其他 func 的名字
}
// 全局变量
type Global struct {
Doc string // 注释
Name string // 全局变量名
ImportPath []string // 导入路径(仅针对导入对象)
ExportName string // 导出名字
Type string // 类型信息
Value string // 初始值(导入变量忽略)
Mutable bool // 是否可写
}
// 函数定义
type Func struct {
Doc string // 注释
Name string // 函数名
ImportPath []string // 导入路径(仅针对导入对象)
ExportName string // 导出名字
Type *FuncType // 函数类型
Body *FuncBody // 函数体
}
// 函数类型
type FuncType struct {
Params []Field // 参数名字
ResultsType []string // 返回值类型
}
// 函数定义
type FuncBody struct {
Locals []Field // 局部变量
Insts []Instruction // 指令列表
}
// 参数和局部变量信息
type Field struct {
Doc string // 注释
Name string // 变量名字
Type string // 变量类型
}
// 指令对应接口
type Instruction interface {
DocString() string
WATString() string // 支持缩进
isInstruction()
}
// 版权 @2023 凹语言 作者。保留所有权利。
package wat
// 二进制编码
// 版权 @2023 凹语言 作者。保留所有权利。
package wat
// 指令集
# Wat 文本到 wasm 转化
目标不是解析完整的 wat 语法, 而是能满足凹语言输出的 wat 格式.
// 版权 @2023 凹语言 作者。保留所有权利。
package wat
// Token 结构
type Token struct {
Pos TokenPos // 位置
Kind TokenKind // 类型
Value string // 面值
}
// 位置信息
type TokenPos struct {
Offset int // offset, 从 0 开始
Line int // 行号, 从 1 开始
Column int // 列号, 从 1 开始的字节数
}
// 记号类型
type TokenKind int
const (
// 非法/结尾/注释
ILLEGAL TokenKind = iota
EOF
COMMENT
// 面值类型
literal_beg
INSTRUCTION // 指令, 比如 global.get
IDENT // 表示符, 比如 $name
INT // 12345
FLOAT // 123.45
CHAR // 'a'
STRING // "abc"
literal_end
// 特殊符号
operator_beg
LPAREN // (
RPAREN // )
operator_end
// 关键字
keyword_beg
I32 // i32
I64 // i64
F32 // f32
F64 // f64
MODULE // module
IMPORT // import
EXPORT // export
MEMORY // memory
TABLE // table
GLOBAL // global
LOCAL // local
DATA // data
ELEM // elem
TYPE // type
FUNC // func
PARAM // param
RESULT // result
START // start
keyword_end
)
// 将 wat 转化为 token 列表
func Tokenize(input []byte) []Token {
return nil
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册