sketch
This commit is contained in:
53
ast.go
Normal file
53
ast.go
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package avo
|
||||||
|
|
||||||
|
// GoType represents a Golang type.
|
||||||
|
type GoType interface{}
|
||||||
|
|
||||||
|
// Parameter represents a parameter to an assembly function.
|
||||||
|
type Parameter struct {
|
||||||
|
Name string
|
||||||
|
Type GoType
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instruction is a single instruction in a function.
|
||||||
|
type Instruction struct {
|
||||||
|
Mnemonic string
|
||||||
|
Operands []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// File represents an assembly file.
|
||||||
|
type File struct {
|
||||||
|
functions []*Function
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function represents an assembly function.
|
||||||
|
type Function struct {
|
||||||
|
name string
|
||||||
|
params []Parameter
|
||||||
|
inst []Instruction
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFunction(name string) *Function {
|
||||||
|
return &Function{
|
||||||
|
name: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Function) AddInstruction(i Instruction) {
|
||||||
|
f.inst = append(f.inst, i)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns the function name.
|
||||||
|
func (f *Function) Name() string { return f.name }
|
||||||
|
|
||||||
|
// FrameBytes returns the size of the stack frame in bytes.
|
||||||
|
func (f *Function) FrameBytes() int {
|
||||||
|
// TODO(mbm): implement
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// ArgumentBytes returns the size of the arguments in bytes.
|
||||||
|
func (f *Function) ArgumentBytes() int {
|
||||||
|
// TODO(mbm): implement
|
||||||
|
return 0
|
||||||
|
}
|
||||||
85
printer.go
Normal file
85
printer.go
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
package avo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// dot is the pesky unicode dot used in Go assembly.
|
||||||
|
const dot = "\u00b7"
|
||||||
|
|
||||||
|
type Printer interface {
|
||||||
|
Print(*File) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type GoPrinter struct {
|
||||||
|
w io.Writer
|
||||||
|
by string // generated by
|
||||||
|
copyright []string
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGoPrinter(w io.Writer) *GoPrinter {
|
||||||
|
return &GoPrinter{
|
||||||
|
w: w,
|
||||||
|
by: "avo",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) SetGeneratedBy(by string) {
|
||||||
|
p.by = by
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) Print(f *File) error {
|
||||||
|
p.header()
|
||||||
|
|
||||||
|
for _, fn := range f.functions {
|
||||||
|
p.function(fn)
|
||||||
|
}
|
||||||
|
|
||||||
|
return p.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) header() {
|
||||||
|
p.generated()
|
||||||
|
p.nl()
|
||||||
|
p.incl("textflag.h")
|
||||||
|
p.nl()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) generated() {
|
||||||
|
p.comment(fmt.Sprintf("Code generated by %s. DO NOT EDIT.", p.by))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) incl(path string) {
|
||||||
|
p.printf("#include \"%s\"\n", path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) comment(line string) {
|
||||||
|
p.multicomment([]string{line})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) multicomment(lines []string) {
|
||||||
|
for _, line := range lines {
|
||||||
|
p.printf("// %s\n", line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) function(f *Function) {
|
||||||
|
p.printf("TEXT %s%s(SB),0,$%d-%d\n", dot, f.Name(), f.FrameBytes(), f.ArgumentBytes())
|
||||||
|
|
||||||
|
for _, i := range f.inst {
|
||||||
|
p.printf("\t%s\t%s\n", i.Mnemonic, strings.Join(i.Operands, ", "))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) nl() {
|
||||||
|
p.printf("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *GoPrinter) printf(format string, args ...interface{}) {
|
||||||
|
if _, err := fmt.Fprintf(p.w, format, args...); err != nil {
|
||||||
|
p.err = err
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user