ir

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: 7 Imported by: 0

Documentation

Overview

Package ir实现了一种中间代码

Deprecated:已弃用

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

ArgEnum 是中间代码的操作数类型枚举

OPEnum 是中间代码的指令枚举

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

Index

Constants

This section is empty.

Variables

View Source
var ArgEnumStr = [...]string{
	NoArg:       "noarg (未定义的操作数)",
	StackVar:    "stackvar (栈变量)",
	Var:         "var (全局变量)",
	Tmp:         "tmp (临时变量)",
	TmpIntVar:   "tmp_int_var (int型临时变量)",
	TmpFloatVar: "ttmp_float_var (float型临时变量)",
	ImmInt:      "imm_int (int型立即数)",
	ImmFloat:    "imm_float (float型立即数)",
}
View Source
var OPEnumStr = [...]string{
	NoOp:  "no_op (未定义的指令)",
	ADDOP: "add (加法运算)",
	SUBOP: "sub (减法运算)",
	MOVOP: "mov (移动操作)",
}

Functions

This section is empty.

Types

type ArgEnum

type ArgEnum int8

ArgEnum 操作数枚举

const (
	//未定义的操作数
	NoArg ArgEnum = iota
	//栈变量
	StackVar
	//全局变量
	Var
	//临时变量
	Tmp
	//int型临时变量,必须编译期可求值
	TmpIntVar
	//float型临时变量,必须编译期可求值
	TmpFloatVar
	//int型立即数
	ImmInt
	//float型立即数
	ImmFloat
)

func (ArgEnum) IsImm

func (a ArgEnum) IsImm() bool

func (ArgEnum) String

func (a ArgEnum) String() string

type IrNode

type IrNode struct {
	Arg1Obj   string  //第一操作数
	Arg2Obj   string  //第二操作数
	ResultObj string  //运算结果的值
	Op        OPEnum  //操作码
	Arg1Typ   ArgEnum //第一操作数类型
	Arg2Typ   ArgEnum //第二操作数类型
	ResultTyp ArgEnum //运算结果的值类型
}

IrNode 代表一条ir指令

func (IrNode) String

func (n IrNode) String() string

type OPEnum

type OPEnum int

OPEnum 指令枚举

const (
	NoOp OPEnum = iota //零值表示未定义的指令
	ADDOP
	SUBOP
	MOVOP
)

func (OPEnum) String

func (o OPEnum) String() string

type ToState

type ToState struct {
	// contains filtered or unexported fields
}

ToState 转换状态

记录某次ast转换ir的特定状态,并发不安全

func NewToState

func NewToState() *ToState

NewToState 返回一个可使用的 ToState 指针

func (*ToState) ASSIGNOptimize

func (t *ToState) ASSIGNOptimize(ptrir *IrNode, ret *[]IrNode)

ASSIGNOptimize 赋值转换的中间代码优化

实现下列优化

  • 如果赋值源操作数类型为临时变量,且这个临时变量为上一个的结果,将上一个的结果改写为赋值目的操作数
  • 如果其中任意两条中间代码形如(a op1 b) op2 c,且b和c为立即数,同时op1和op2优先级相同,改写为a op1 (b op2 c),并编译期求值

func (*ToState) AmexprOptimize

func (t *ToState) AmexprOptimize(ret *[]IrNode) (ArgObj string, ArgTyp ArgEnum)

AmexprOptimize 算术表达式优化

实现下列优化

  • 如果结果为立即数临时变量(也就是编译期可求值),直接使用该立即数,不等到运行时计算

func (*ToState) AmexprOptimizeOrImm

func (t *ToState) AmexprOptimizeOrImm(ptrir *IrNode, typ int8, op enum.OPSymbol) bool

AmexprOptimizeOrImm 算术表达式可能立即数优化

如果算术表达式的操作数都是立即数(也就是编译期可求值),直接计算该立即数,不等到运行时计算

func (*ToState) HavaTmpVar

func (t *ToState) HavaTmpVar(name string) string

HavaTmpVar 查找本次转换是否存在临时变量

  • name是被查找的临时变量

如果查找到存在,返回临时变量的值

如果查找到不存在,将 panic

func (*ToState) ObjectToArg

func (t *ToState) ObjectToArg(obj *ast.Object, sbt *ast.Sbt) (ArgObj string, ArgTyp ArgEnum)

ObjectToArg 转换一个对象为中间代码操作数

func (*ToState) ToASSIGN

func (t *ToState) ToASSIGN(ptr *ast.ASSIGNNode, sbt *ast.Sbt) (ret []IrNode)

ToASSIGN 将一个赋值节点转换为中间代码

func (*ToState) ToAmexpr

func (t *ToState) ToAmexpr(ptr *ast.OpExpr, sbt *ast.Sbt) (ret []IrNode)

ToAmexpr 将一个算术表达式节点转换为中间代码

func (*ToState) ToExprNode

func (t *ToState) ToExprNode(ptr ast.Node, sbt *ast.Sbt, ret *[]IrNode) (ArgObj string, ArgTyp ArgEnum)

ToExprNode 转换一个表达式节点

Jump to

Keyboard shortcuts

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