From 6449d4762a046a20a17e6e32ae4c6c3bc27ae4e3 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Tue, 16 Nov 2021 21:08:46 -1000 Subject: [PATCH] Basic parsing --- assembler/go.mod | 5 +++++ assembler/go.sum | 3 +++ assembler/parse.go | 25 +++++++++++++++++++++++++ assembler/parse_test.go | 20 ++++++++++++++++++++ assembler/test.yaml | 7 +++++++ 5 files changed, 60 insertions(+) create mode 100644 assembler/go.mod create mode 100644 assembler/go.sum create mode 100644 assembler/parse.go create mode 100644 assembler/parse_test.go create mode 100644 assembler/test.yaml diff --git a/assembler/go.mod b/assembler/go.mod new file mode 100644 index 0000000..2e175da --- /dev/null +++ b/assembler/go.mod @@ -0,0 +1,5 @@ +module github.com/firestuff/subcoding/assembler + +go 1.17 + +require gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/assembler/go.sum b/assembler/go.sum new file mode 100644 index 0000000..7534661 --- /dev/null +++ b/assembler/go.sum @@ -0,0 +1,3 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/assembler/parse.go b/assembler/parse.go new file mode 100644 index 0000000..329ed3b --- /dev/null +++ b/assembler/parse.go @@ -0,0 +1,25 @@ +package assembler + +import "gopkg.in/yaml.v2" + +type Program struct { + Functions []*Function `yaml:"functions"` +} + +type Function []*Operation +type Operation []string + +func NewProgramFromBytes(in []byte) (*Program, error) { + prog := &Program{} + + err := yaml.UnmarshalStrict(in, &prog) + if err != nil { + return nil, err + } + + return prog, nil +} + +func NewProgramFromString(in string) (*Program, error) { + return NewProgramFromBytes([]byte(in)) +} diff --git a/assembler/parse_test.go b/assembler/parse_test.go new file mode 100644 index 0000000..3d7eb00 --- /dev/null +++ b/assembler/parse_test.go @@ -0,0 +1,20 @@ +package assembler + +import "testing" + +func TestSimple(t *testing.T) { + prog, err := NewProgramFromString(` +functions: +- - [add, f0, 1] + - [call, +1] + - [ltu, f0, 3] + - [jmpt, -3] + +- - [add, g0, 1] +`) + if err != nil { + t.Fatal(err) + } + + t.Logf("%+v", prog) +} diff --git a/assembler/test.yaml b/assembler/test.yaml new file mode 100644 index 0000000..e2735ce --- /dev/null +++ b/assembler/test.yaml @@ -0,0 +1,7 @@ +functions: +- - [add, f0, 1] + - [call, +1] + - [ltu, f0, 3] + - [jmpt, -3] + +- - [add, g0, 1]