diff --git a/ttir/emit.go b/ttir/emit.go new file mode 100644 index 0000000..182a8e0 --- /dev/null +++ b/ttir/emit.go @@ -0,0 +1 @@ +package ttir diff --git a/ttir/ttir.go b/ttir/ttir.go index 5cac9d4..1739a60 100644 --- a/ttir/ttir.go +++ b/ttir/ttir.go @@ -1,5 +1,10 @@ package ttir +import ( + "fmt" + "strings" +) + type Program struct { Functions []Function } @@ -9,6 +14,16 @@ type Function struct { Instructions []Instruction } +func (f *Function) String() string { + var builder strings.Builder + builder.WriteString(fmt.Sprintf("fn %s\n", f.Name)) + for _, i := range f.Instructions { + builder.WriteString(" ") + builder.WriteString(i.String()) + } + return builder.String() +} + type Instruction interface { String() string instruction() @@ -18,7 +33,9 @@ type Ret struct { op Operand } -func (r *Ret) String() {} +func (r *Ret) String() string { + return fmt.Sprintf("ret %s\n", r.op) +} func (r *Ret) instruction() {} type Operand interface { @@ -30,4 +47,7 @@ type Constant struct { Value int64 } +func (c *Constant) String() string { + return fmt.Sprintf("%d", c.Value) +} func (c *Constant) operand() {}