diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-16 12:30:31 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-16 12:30:31 +0100 |
| commit | ee9397bc031dc33e4f735b3331643bbf60a0d17a (patch) | |
| tree | 42087d58e916904af3e70de6171e0f1c9c894d8f /comp | |
| parent | 31e3793202402fda21905027c18ebfa5c8d8c832 (diff) | |
feat: handle slice expressions
Diffstat (limited to 'comp')
| -rw-r--r-- | comp/compiler.go | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/comp/compiler.go b/comp/compiler.go index 8a7db22..4c691b2 100644 --- a/comp/compiler.go +++ b/comp/compiler.go @@ -178,7 +178,6 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { emit(t, vm.CallX, t.Beg) case lang.Colon: - showStack() pop() ks := pop() ts := top() @@ -242,7 +241,7 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { } emit(t, vm.Vassign) - case lang.MapAssign: + case lang.IndexAssign: s := stack[len(stack)-3] switch s.Type.Rtype.Kind() { case reflect.Array, reflect.Slice: @@ -318,6 +317,10 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { c.Symbols[t.Str] = &symbol.Symbol{Kind: symbol.Label, Value: vm.ValueOf(lc)} } + case lang.Len: + push(&symbol.Symbol{Type: c.Symbols["int"].Type}) + emit(t, vm.Len, t.Beg) + case lang.JumpFalse: var i int if s, ok := c.Symbols[t.Str]; !ok { @@ -393,8 +396,6 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { case symbol.Unset: return errorf("invalid symbol: %s", s.Name) default: - // FIXME: handle pointer indirection here - log.Println("## XXX", s.Type, s.Type.IsPtr()) typ := s.Type.Rtype isPtr := typ.Kind() == reflect.Pointer if isPtr { @@ -416,6 +417,15 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) { case lang.Return: emit(t, vm.Return, t.Beg, t.End) + case lang.Slice: + if stack[len(stack)-3].IsInt() { + emit(t, vm.Slice3) + stack = stack[:len(stack)-4] + } else { + emit(t, vm.Slice) + stack = stack[:len(stack)-3] + } + default: return fmt.Errorf("generate: unsupported token %v", t) } @@ -457,7 +467,7 @@ func (c *Compiler) PrintCode() { } extra := "" switch l.Op { - case vm.Jump, vm.JumpFalse, vm.JumpTrue, vm.JumpSetFalse, vm.JumpSetTrue, vm.Calli: + case vm.Jump, vm.JumpFalse, vm.JumpTrue, vm.JumpSetFalse, vm.JumpSetTrue: if d, ok := labels[i+l.Arg[0]]; ok { extra = "// " + d[0] } |
