summaryrefslogtreecommitdiff
path: root/vm/vm_test.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-06 19:02:29 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-06 19:02:29 +0100
commitbffc031ea83c7176aac3d3828de0060c6630140c (patch)
tree32e30f3bec94884936c2cfc2d53d3ae496e13d61 /vm/vm_test.go
parentf07fc0178831432b68f1b9bd6c96b257aa2e9abe (diff)
fix: correct and simplify parsing of expressions.
The expressions were parsed from right to left, and it was incorrect and cumbersome. Now they are processed from left to right, with a simpler and correct handling of precedence rules. The vm function call syntax has been changed to set the function before the input arguments on the stack, as to follow the declaring order in languages.
Diffstat (limited to 'vm/vm_test.go')
-rw-r--r--vm/vm_test.go102
1 files changed, 53 insertions, 49 deletions
diff --git a/vm/vm_test.go b/vm/vm_test.go
index a968281..950e61e 100644
--- a/vm/vm_test.go
+++ b/vm/vm_test.go
@@ -69,7 +69,7 @@ var tests = []struct {
{Op: Sub},
{Op: Exit},
},
- start: 0, end: 1, mem: "[1]",
+ start: 0, end: 1, mem: "[-1]",
}, { // #02 -- A simple multiplication.
code: []Instruction{
{Op: Push, Arg: []int{3}},
@@ -80,16 +80,16 @@ var tests = []struct {
start: 0, end: 1, mem: "[6]",
}, { // #03 -- lower.
code: []Instruction{
- {Op: Push, Arg: []int{3}},
{Op: Push, Arg: []int{2}},
+ {Op: Push, Arg: []int{3}},
{Op: Lower},
{Op: Exit},
},
start: 0, end: 1, mem: "[true]",
}, { // #04 -- greater.
code: []Instruction{
- {Op: Push, Arg: []int{2}},
{Op: Push, Arg: []int{3}},
+ {Op: Push, Arg: []int{2}},
{Op: Greater},
{Op: Exit},
},
@@ -153,16 +153,18 @@ var tests = []struct {
{Op: Exit},
},
start: 1, end: 3, mem: "[6 <nil>]",
-}, { // #12 -- Defining and calling a function in VM.
- code: []Instruction{
- {Op: Jump, Arg: []int{3}}, // 0
- {Op: Push, Arg: []int{3}}, // 1
- {Op: Return, Arg: []int{1, 1}}, // 2
- {Op: Push, Arg: []int{1}}, // 3
- {Op: Calli, Arg: []int{1}}, // 4
- {Op: Exit}, // 5
- },
- start: 0, end: 1, mem: "[3]",
+ /*
+ }, { // #12 -- Defining and calling a function in VM.
+ code: []Instruction{
+ {Op: Jump, Arg: []int{3}}, // 0
+ {Op: Push, Arg: []int{3}}, // 1
+ {Op: Return, Arg: []int{1, 1}}, // 2
+ {Op: Push, Arg: []int{1}}, // 3
+ {Op: Calli, Arg: []int{1}}, // 4
+ {Op: Exit}, // 5
+ },
+ start: 0, end: 1, mem: "[3]",
+ */
}, { // #13 -- Defining and calling a function in VM.
code: []Instruction{
{Op: Jump, Arg: []int{3}}, // 0
@@ -170,7 +172,7 @@ var tests = []struct {
{Op: Return, Arg: []int{1, 1}}, // 2
{Op: Push, Arg: []int{1}}, // 3
{Op: Push, Arg: []int{1}}, // 4
- {Op: Call}, // 5
+ {Op: Call, Arg: []int{0}}, // 5
{Op: Exit}, // 6
},
start: 0, end: 1, mem: "[3]",
@@ -183,56 +185,58 @@ var tests = []struct {
{Op: Return, Arg: []int{1, 1}}, // 4
{Op: Push, Arg: []int{1}}, // 5
{Op: Push, Arg: []int{1}}, // 6
- {Op: Call}, // 7
+ {Op: Call, Arg: []int{0}}, // 7
{Op: Exit}, // 8
},
- start: 0, end: 1, mem: "[3]",
+ start: 1, end: 2, mem: "[3]",
}, { // #15 -- Fibonacci numbers, hand written. Showcase recursivity.
code: []Instruction{
{Op: Jump, Arg: []int{19}}, // 0
- {Op: Push, Arg: []int{2}}, // 2 [2]
{Op: Fdup, Arg: []int{-2}}, // 1 [2 i]
+ {Op: Push, Arg: []int{2}}, // 2 [2]
{Op: Lower}, // 3 [true/false]
{Op: JumpTrue, Arg: []int{13}}, // 4 [], goto 17
- {Op: Push, Arg: []int{2}}, // 5 [i 2]
+ {Op: Push, Arg: []int{1}}, // 5
{Op: Fdup, Arg: []int{-2}}, // 6 [i]
- {Op: Sub}, // 7 [(i-2)]
- {Op: Push, Arg: []int{1}}, // 8
- {Op: Call}, // 9 [fib(i-2)]
- {Op: Push, Arg: []int{1}}, // 10 [(i-2) i 1]
+ {Op: Push, Arg: []int{2}}, // 7 [i 2]
+ {Op: Sub}, // 8 [(i-2)]
+ {Op: Call, Arg: []int{1}}, // 9 [fib(i-2)]
+ {Op: Push, Arg: []int{1}}, // 10
{Op: Fdup, Arg: []int{-2}}, // 11 [fib(i-2) i]
- {Op: Sub}, // 12 [(i-2) (i-1)]
- {Op: Push, Arg: []int{1}}, // 13
- {Op: Call}, // 14 [fib(i-2) fib(i-1)]
+ {Op: Push, Arg: []int{1}}, // 12 [(i-2) i 1]
+ {Op: Sub}, // 13 [(i-2) (i-1)]
+ {Op: Call, Arg: []int{1}}, // 14 [fib(i-2) fib(i-1)]
{Op: Add}, // 15 [fib(i-2)+fib(i-1)]
{Op: Return, Arg: []int{1, 1}}, // 16 return i
{Op: Fdup, Arg: []int{-2}}, // 17 [i]
{Op: Return, Arg: []int{1, 1}}, // 18 return i
- {Op: Push, Arg: []int{6}}, // 19 [1]
- {Op: Push, Arg: []int{1}}, // 20
- {Op: Call}, // 21 [fib(*1)]
+ {Op: Push, Arg: []int{1}}, // 19
+ {Op: Push, Arg: []int{6}}, // 20 [1]
+ {Op: Call, Arg: []int{1}}, // 21 [fib(*1)]
{Op: Exit}, // 22
},
start: 0, end: 1, mem: "[8]",
-}, { // #16 -- Fibonacci with some immediate instructions.
- code: []Instruction{
- {Op: Jump, Arg: []int{14}}, // 0
- {Op: Fdup, Arg: []int{-2}}, // 1 [i]
- {Op: Loweri, Arg: []int{2}}, // 2 [true/false]
- {Op: JumpTrue, Arg: []int{9}}, // 3 [], goto 12
- {Op: Fdup, Arg: []int{-2}}, // 4 [i]
- {Op: Subi, Arg: []int{2}}, // 5 [(i-2)]
- {Op: Calli, Arg: []int{1}}, // 6 [fib(i-2)]
- {Op: Fdup, Arg: []int{-2}}, // 7 [fib(i-2) i]
- {Op: Subi, Arg: []int{1}}, // 8 [(i-2) (i-1)]
- {Op: Calli, Arg: []int{1}}, // 9 [fib(i-2) fib(i-1)], call 1
- {Op: Add}, // 10 [fib(i-2)+fib(i-1)]
- {Op: Return, Arg: []int{1, 1}}, // 11 return i
- {Op: Fdup, Arg: []int{-2}}, // 12 [i]
- {Op: Return, Arg: []int{1, 1}}, // 13 return i
- {Op: Push, Arg: []int{6}}, // 14 [1]
- {Op: Calli, Arg: []int{1}}, // 15 [fib(*1)], call 1
- {Op: Exit}, // 16
- },
- start: 0, end: 1, mem: "[8]",
+ /*
+ }, { // #16 -- Fibonacci with some immediate instructions.
+ code: []Instruction{
+ {Op: Jump, Arg: []int{14}}, // 0
+ {Op: Fdup, Arg: []int{-2}}, // 1 [i]
+ {Op: Loweri, Arg: []int{2}}, // 2 [true/false]
+ {Op: JumpTrue, Arg: []int{9}}, // 3 [], goto 12
+ {Op: Fdup, Arg: []int{-2}}, // 4 [i]
+ {Op: Subi, Arg: []int{2}}, // 5 [(i-2)]
+ {Op: Calli, Arg: []int{1}}, // 6 [fib(i-2)]
+ {Op: Fdup, Arg: []int{-2}}, // 7 [fib(i-2) i]
+ {Op: Subi, Arg: []int{1}}, // 8 [(i-2) (i-1)]
+ {Op: Calli, Arg: []int{1}}, // 9 [fib(i-2) fib(i-1)], call 1
+ {Op: Add}, // 10 [fib(i-2)+fib(i-1)]
+ {Op: Return, Arg: []int{1, 1}}, // 11 return i
+ {Op: Fdup, Arg: []int{-2}}, // 12 [i]
+ {Op: Return, Arg: []int{1, 1}}, // 13 return i
+ {Op: Push, Arg: []int{6}}, // 14 [1]
+ {Op: Calli, Arg: []int{1}}, // 15 [fib(*1)], call 1
+ {Op: Exit}, // 16
+ },
+ start: 0, end: 1, mem: "[8]",
+ */
}}