mirror of
https://github.com/hazemKrimi/jack-compiler.git
synced 2026-05-02 01:50:25 +00:00
feat: vm code writing functions
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user