summaryrefslogtreecommitdiff
path: root/vm/vm.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-10-21 11:20:52 -0400
committerMarc Vertes <mvertes@free.fr>2023-10-21 11:20:52 -0400
commit20d331813cf05f42961f0f6df531c2880f753a07 (patch)
tree409e2b6b358579dd7199947f162d490b7c9ffe08 /vm/vm.go
parente7814f9d8c1d062852f5c9a652a1c4eb3335cf04 (diff)
parser: implement operator precedence rules in expressions
Diffstat (limited to 'vm/vm.go')
-rw-r--r--vm/vm.go20
1 files changed, 10 insertions, 10 deletions
diff --git a/vm/vm.go b/vm/vm.go
index 4057fc1..f6499fd 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -23,11 +23,13 @@ const (
Fdup // addr -- value ; value = mem[addr]
Equal // n1 n2 -- cond ; cond = n1 == n2
Exit // -- ;
+ Greater // n1 n2 -- cond; cond = n1 > n2
Jump // -- ; ip += $1
JumpTrue // cond -- ; if cond { ip += $1 }
JumpFalse // cond -- ; if cond { ip += $1 }
Lower // n1 n2 -- cond ; cond = n1 < n2
Loweri // n1 -- cond ; cond = n1 < $1
+ Mul // n1 n2 -- prod ; prod = n1*n2
Pop // v --
Push // -- v
Return // [r1 .. ri] -- ; exit frame: sp = fp, fp = pop
@@ -47,11 +49,13 @@ var strop = [...]string{ // for VM tracing.
Exit: "Exit",
Fassign: "Fassign",
Fdup: "Fdup",
+ Greater: "Greater",
Jump: "Jump",
JumpTrue: "JumpTrue",
JumpFalse: "JumpFalse",
Lower: "Lower",
Loweri: "Loweri",
+ Mul: "Mul",
Pop: "Pop",
Push: "Push",
Return: "Return",
@@ -97,6 +101,9 @@ func (m *Machine) Run() (err error) {
case Add:
mem[sp-2] = mem[sp-2].(int) + mem[sp-1].(int)
mem = mem[:sp-1]
+ case Mul:
+ mem[sp-2] = mem[sp-2].(int) * mem[sp-1].(int)
+ mem = mem[:sp-1]
case Assign:
mem[op[2]] = mem[sp-1]
mem = mem[:sp-1]
@@ -151,6 +158,9 @@ func (m *Machine) Run() (err error) {
ip += int(op[2])
continue
}
+ case Greater:
+ mem[sp-2] = mem[sp-1].(int) > mem[sp-2].(int)
+ mem = mem[:sp-1]
case Lower:
mem[sp-2] = mem[sp-1].(int) < mem[sp-2].(int)
mem = mem[:sp-1]
@@ -214,16 +224,6 @@ func CodeString(op []int64) string {
func Disassemble(code [][]int64) (asm string) {
for _, op := range code {
asm += CodeString(op) + "\n"
- /*
- switch len(op) {
- case 2:
- asm += strop[op[1]] + "\n"
- case 3:
- asm += fmt.Sprintf("%s %d\n", strop[op[1]], op[2])
- case 4:
- asm += fmt.Sprintf("%s %d %d\n", strop[op[1]], op[2], op[3])
- }
- */
}
return asm
}