feat: vm code writing functions

This commit is contained in:
2026-04-28 11:31:07 +01:00
parent c65e79a02b
commit a2bf02556d
+149
View File
@@ -0,0 +1,149 @@
package code
import "fmt"
import "strings"
type Segment int
type ArithmeticLogicalCommand int
const (
CONSTANT Segment = iota
ARGUMENT
LOCAL
STATIC
THIS
THAT
POINTER
TEMP
)
const (
ADD ArithmeticLogicalCommand = iota
SUB
NEG
EQ
GT
LT
AND
OR
NOT
)
func SegmentText(segment Segment) string {
switch segment {
case CONSTANT:
return "constant"
case ARGUMENT:
return "argument"
case LOCAL:
return "local"
case STATIC:
return "static"
case THIS:
return "this"
case THAT:
return "that"
case POINTER:
return "pointer"
case TEMP:
return "temp"
}
return "constant"
}
func WritePush(output *strings.Builder, segment Segment, index int) error {
if _, err := output.WriteString("push " + SegmentText(segment) + " " + fmt.Sprint(index)); err != nil {
return err
}
return nil
}
func WritePop(output *strings.Builder, segment Segment, index int) error {
if _, err := output.WriteString("pop " + SegmentText(segment) + " " + fmt.Sprint(index)); err != nil {
return err
}
return nil
}
func WriteArithmeticLogical(output *strings.Builder, command ArithmeticLogicalCommand) error {
var commandText string
switch command {
case ADD:
commandText = "add"
case SUB:
commandText = "sub"
case NEG:
commandText = "neg"
case EQ:
commandText = "eq"
case GT:
commandText = "gt"
case LT:
commandText = "lt"
case AND:
commandText = "and"
case OR:
commandText = "or"
case NOT:
commandText = "not"
}
if _, err := output.WriteString(commandText); err != nil {
return err
}
return nil
}
func WriteLabel(output *strings.Builder, label string) error {
if _, err := output.WriteString("label " + label); err != nil {
return err
}
return nil
}
func WriteGoto(output *strings.Builder, label string) error {
if _, err := output.WriteString("goto " + label); err != nil {
return err
}
return nil
}
func WriteIfGoto(output *strings.Builder, label string) error {
if _, err := output.WriteString("if-goto " + label); err != nil {
return err
}
return nil
}
func WriteCall(output *strings.Builder, function string, args int) error {
if _, err := output.WriteString("call " + function + " " + fmt.Sprint(args)); err != nil {
return err
}
return nil
}
func WriteFunction(output *strings.Builder, function string, params int) error {
if _, err := output.WriteString("function " + function + " " + fmt.Sprint(params)); err != nil {
return err
}
return nil
}
func WriteReturn(output *strings.Builder) error {
if _, err := output.WriteString("return"); err != nil {
return err
}
return nil
}