ir2

package
v0.0.0-...-a214d60 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 7, 2024 License: BSD-3-Clause Imports: 13 Imported by: 0

Documentation

Overview

Package ir2实现了一种中间代码

ir实现的中间代码,是四元式、线性的中间代码

OPEnum 是中间代码的指令枚举

IrNode 给定了一条ir指令的结构体定义

# 指令 格式 op<arg1,arg2,result> []表示可选

  • 变量声明 var<,,ast>
  • 常量声明 const<,,ast>
  • 赋值声明 mov<src,IncludeSrc,dest>
  • 调用 call<callname,funcname,ParameNum and linefeed>
  • 传参 papa<num,tmp,isNoEnd>
  • 调用结束 stopcall<,,linefeed>
  • 对象 obj<,,value>
  • 函数 func<,,info>
  • 右大括号 rbrace<,,>
  • 加减乘除小于大于等于不等取余数 op<src1,src2,IncludeOpValue and linefeed> (Include operation values缩写成IncludeOpValue)
  • 临时变量 tmpvar<name,type,>
  • 返回 ret<[value],ReturnValueAfter,endIndex>
  • for循环 for<,,>
  • 分号 ;<,,>
  • 逗号 comma<,,>
  • 空行 linefeed<,,>
  • 局部变量 localVar<Name,Type,>
  • if分支 if<boolexpr,Nohaveboolexpr,>
  • else分支 else<,,>
  • else if 分支 if<boolexpr,Nohaveboolexpr,>
  • 类型转换 TypeConvert<typ,value,>
  • 一字段结构体 struct1field<field,,name>
  • 二字段结构体 struct2field<field1,field2,name>
  • 结构体声明 structdecl<,,name>
  • 字段 field<field1,,>
  • 2个字段 field<field1,field2,>
  • 3个字段 field<field1,field2,field3>
  • 赋值 assign<,,>
  • 选择器左值和右值 left select right<left,right,>
  • 选择器右值 select right<right,>
  • 分配一个类型的内存 malloc<type,,linefeed>

Index

Constants

This section is empty.

Variables

View Source
var OPEnumStr = [...]string{
	NoOp:            "no_op (未定义的指令)",
	ADDOP:           "add (加法运算)",
	SUBOP:           "sub (减法运算)",
	MOVOP:           "mov (移动操作)",
	VarOP:           "var(变量声明)",
	ConstOP:         "const(常量声明)",
	MULOP:           "mul(乘法运算)",
	DIVOP:           "dlv 除法运算",
	FuncOP:          "func (函数声明)",
	CallOP:          "call(调用)",
	ObjOP:           "obj(对象)",
	RbraceOP:        "右大括号 ",
	TmpVarOP:        "tmp(临时变量)",
	RetOp:           "ret(返回)",
	PaPaOp:          "papa(传递参数)",
	EndCallOp:       "结束调用 ",
	ForOp:           "for ",
	SemicolonOp:     "分号",
	LessOp:          "less(小于)",
	GreaterOp:       "greater(大于)",
	EqualOp:         "equal(等于)",
	NoEqualOp:       "noequal(不等与)",
	CommaOp:         "comma(逗号)",
	LbraceOp:        "左大括号",
	LineFeedOp:      "linefeed(空行)",
	LocalVarOp:      "loacl var(局部变量)",
	RPARENOp:        "rparen(右小括号)",
	IfOp:            "if",
	RemainOp:        "remain(取余数)",
	ElseOp:          "else",
	ElseIfOp:        "else if",
	TypeConvertOp:   "type convert(类型转换)",
	Struct1Field:    "struct 1 field(1字段结构体)",
	Struct2Field:    "struct 2 field(2字段结构体)",
	StructDeclStart: "struct decl start(结构体开始)",
	StructDeclEnd:   "struct decl end(结构体结束)",
	Field:           "field(字段)",
	Field3:          "field3(3个字段)",
	AssignOp:        "assign (=)",
	LeftSelectRight: "left select right(选择器左值和右值)",
	SelectRight:     "select right(选择器右值)",
	Malloc:          "malloc(分配一个类型的内存)",
}

Functions

func NodeToIr

func NodeToIr(f *File, n []ast.Node)

func OneNodeToIr

func OneNodeToIr(f *File, n ast.Node, LineNum int, linefeed bool)

OneNodeToIr 将一个抽象语法树节点转换为ir

Types

type File

type File struct {
	//全局声明
	GlobalDecl []ast.Node
	//指令
	Ir []IrNode
	//变量初始化
	VarInit []IrNode

	//包名
	PackageName string
	// 文件名
	FileName string
	//是否有自定义init函数
	HaveInitFunc bool
	//是否在函数内
	InFunc   bool
	Sbt      *ast.Sbt
	FuncInfo *ast.FuncInfo

	//错误处理上下文
	Errctx *errcode.ErrCtx
	// contains filtered or unexported fields
}

func NewFile

func NewFile(t *ast.Tree, Errctx *errcode.ErrCtx) *File

func (*File) String

func (f *File) String() string

type Ir2

type Ir2 interface {
	String() string
	// contains filtered or unexported methods
}

Ir2 表示一个可以包含ir2定义的ir指令的类型

type IrNode

type IrNode struct {
	Op                          OPEnum //操作码
	Arg1Obj                     string //第一操作数
	Arg2Obj                     string //第二操作数
	ResultObj                   string //运算结果的值
	Arg1Typ, Arg2Typ, ResultTyp string
	LineNum                     int //行号
}

IrNode 代表一条ir指令

func NewIr

func NewIr(Op OPEnum, LineNum int) IrNode

func (*IrNode) Arg1ObjExpr

func (n *IrNode) Arg1ObjExpr() **ast.Expr

func (*IrNode) Arg1ObjTyp

func (n *IrNode) Arg1ObjTyp() **astdata.Typ

func (*IrNode) Arg2ObjTyp

func (n *IrNode) Arg2ObjTyp() **astdata.Typ

func (*IrNode) Func

func (n *IrNode) Func() **ast.Node

func (*IrNode) FuncName

func (n *IrNode) FuncName() **ast.FuncNameNode

func (*IrNode) ResultObjTyp

func (n *IrNode) ResultObjTyp() **astdata.Typ

func (IrNode) String

func (n IrNode) String() string

func (*IrNode) Type

func (n *IrNode) Type() **astdata.Typ

func (*IrNode) Var

func (n *IrNode) Var() **ast.VarNode

type OPEnum

type OPEnum int

OPEnum 指令枚举

const (
	NoOp OPEnum = iota //零值表示未定义的指令
	ADDOP
	SUBOP
	MOVOP
	VarOP
	ConstOP
	MULOP
	DIVOP
	FuncOP
	CallOP
	ObjOP
	RbraceOP
	TmpVarOP
	RetOp
	PaPaOp //Passing Parameters
	EndCallOp
	ForOp
	SemicolonOp
	LessOp
	GreaterOp
	EqualOp
	NoEqualOp
	CommaOp
	LbraceOp
	LineFeedOp
	LocalVarOp
	RPARENOp
	IfOp
	RemainOp
	ElseOp
	ElseIfOp
	TypeConvertOp
	Struct1Field
	Struct2Field
	StructDeclStart
	StructDeclEnd
	Field
	Field3
	AssignOp
	LeftSelectRight
	SelectRight
	Malloc
)

func (OPEnum) String

func (o OPEnum) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL