summaryrefslogtreecommitdiff
path: root/comp/compiler.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-11 19:02:27 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-11 19:02:27 +0100
commit5a04b5512a128bd1805792cca4eabacf5fd49b27 (patch)
treea9d4fa09d14bc2b1e17ea2ff14878f556ed41536 /comp/compiler.go
parent7520aa4474ea30985cf26631c6bbdebf38484a0d (diff)
fix: handle assign statements on map elements
A new token MapAssign is added to implement assignements involving a map, slice or array, an index key expression and a value expression.
Diffstat (limited to 'comp/compiler.go')
-rw-r--r--comp/compiler.go21
1 files changed, 19 insertions, 2 deletions
diff --git a/comp/compiler.go b/comp/compiler.go
index 47c4a88..8a136e1 100644
--- a/comp/compiler.go
+++ b/comp/compiler.go
@@ -130,8 +130,13 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
case lang.Index:
showStack()
pop()
- push(&symbol.Symbol{Type: pop().Type.Elem()})
- emit(t, vm.Index)
+ s := pop()
+ if s.Type.Rtype.Kind() == reflect.Map {
+ emit(t, vm.MapIndex)
+ } else {
+ emit(t, vm.Index)
+ }
+ push(&symbol.Symbol{Type: s.Type.Elem()})
case lang.Greater:
push(&symbol.Symbol{Type: booleanOpType(pop(), pop())})
@@ -232,6 +237,18 @@ func (c *Compiler) Generate(tokens parser.Tokens) (err error) {
}
emit(t, vm.Vassign)
+ case lang.MapAssign:
+ s := stack[len(stack)-3]
+ switch s.Type.Rtype.Kind() {
+ case reflect.Array, reflect.Slice:
+ emit(t, vm.IndexSet)
+ case reflect.Map:
+ emit(t, vm.MapSet)
+ default:
+ return errorf("not a map or array: %s", s.Name)
+ }
+ stack = stack[:len(stack)-3]
+
case lang.Equal:
push(&symbol.Symbol{Type: booleanOpType(pop(), pop())})
emit(t, vm.Equal)