From bec71a19e7d7cd0847d1cfa6ef2110d7301fcdd1 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 10 Nov 2023 22:08:46 +0100 Subject: parser: implement support for var declarations The full Go syntax is supported, blocks or line, mutiple comma separated variables, assignments. In local and global frame. --- parser/compiler.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'parser/compiler.go') diff --git a/parser/compiler.go b/parser/compiler.go index e2b7823..bce83d5 100644 --- a/parser/compiler.go +++ b/parser/compiler.go @@ -22,7 +22,7 @@ type Compiler struct { func NewCompiler(scanner *scanner.Scanner) *Compiler { return &Compiler{ - Parser: &Parser{Scanner: scanner, symbols: initUniverse(), labelCount: map[string]int{}}, + Parser: &Parser{Scanner: scanner, symbols: initUniverse(), framelen: map[string]int{}, labelCount: map[string]int{}}, Entry: -1, strings: map[string]int{}, } @@ -86,6 +86,9 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { case lang.CallX: c.Emit(int64(t.Pos), vm.CallX, int64(t.Beg)) + case lang.Grow: + c.Emit(int64(t.Pos), vm.Grow, int64(t.Beg)) + case lang.Define: // TODO: support assignment to local, composite objects st := tokens[i-1] @@ -104,6 +107,10 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { if s.local { c.Emit(int64(st.Pos), vm.Fassign, int64(s.index)) } else { + if s.index == unsetAddr { + s.index = len(c.Data) + c.Data = append(c.Data, s.value) + } c.Emit(int64(st.Pos), vm.Assign, int64(s.index)) } @@ -127,8 +134,7 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { if s.local { c.Emit(int64(t.Pos), vm.Fdup, int64(s.index)) } else { - if s.index < 0 { - // This global symbol is defined but not yet used. Add it to data. + if s.index == unsetAddr { s.index = len(c.Data) c.Data = append(c.Data, s.value) } -- cgit v1.2.3