summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2025-07-30 10:34:23 +0200
committerMarc Vertes <mvertes@free.fr>2025-07-30 10:34:23 +0200
commit39b5ec2e0c34ecf86563cac4d920eacaca74fc79 (patch)
tree5ea799d9374fe3c4d04a0a73d6fa0015ce347736
parent30a3865247db70d55eedb200a2175747f38c4143 (diff)
ev: implement assign
-rwxr-xr-xev38
1 files changed, 29 insertions, 9 deletions
diff --git a/ev b/ev
index 4e33fb9..9b35b50 100755
--- a/ev
+++ b/ev
@@ -11,13 +11,21 @@ BEGIN {
# rigth array contains operators which are right associative
right["="] = right["^"] = 1
+ pc = 0
split("", code)
split("", mem)
+ split("", var)
+ printf "> "
+}
+{
+ line = $0
+ parse()
+ run()
printf "> "
}
-{ line = $0; parse(); run(); printf "> " }
function scan() {
+ ptok = tok
sub(/^[ \t]+/, "", line)
if (match(line, /^[0-9]([.0-9]*(e[+-]*)*[0-9])*/)) {
tok = "d" substr(line, 1, RLENGTH)
@@ -44,24 +52,26 @@ function parse( stack, sl, i) {
while (sl && stack[sl] != "(") code[i++] = stack[sl--]
sl--
} else if (tok in prec) {
+ if (tok == "=" && ptok ~ /^v/) sub(/^v/, "p", code[i-1]) # mutate var to pointer for assign
# Test precedence against stack, or associativity if same precedence
while (sl && (prec[tok] < prec[stack[sl]] || prec[tok] == prec[stack[sl]] && !(stack[sl] in right))) {
code[i++] = stack[sl--]
}
stack[++sl] = tok
- } else code[i++] = tok
+ } else {
+ code[i++] = tok
+ }
}
while (sl) code[i++] = stack[sl--]
# for (j = 0; j < i; j++) printf("%s ", code[j]); print ""
}
-# TODO: assign, if, while, function
+# TODO: if, while, function
function run( c, i, l, t) {
cl = length(code)
ml = length(mem)
- i = 0
- while (i < cl) {
- c = code[i]
+ while (pc < cl) {
+ c = code[pc]
if (c == "+") {
mem[--ml] = mem[ml-1] + mem[ml]
} else if (c == "-") {
@@ -72,11 +82,21 @@ function run( c, i, l, t) {
mem[--ml] = mem[ml-1] / mem[ml]
} else if (c == "^") {
mem[--ml] = mem[ml-1] ^ mem[ml]
- } else {
+ } else if (c == "=") {
+ var[substr(mem[ml-1], 2)] = mem[ml]
+ mem[--ml] = mem[ml]
+ } else if (c ~ /^p/) {
+ mem[++ml] = c
+ } else if (c ~ /^v/) {
+ mem[++ml] = var[substr(c, 2)]
+ } else if (c ~ /^[d]/) {
mem[++ml] = 0 + substr(c, 2)
}
- i++
+ printf "c" pc ": " c; for (i = 1; i <= ml; i++) printf ", " i ":" mem[i]; print ""
+ for (i in var) print "var[" i "]=" var[i]
+ pc++
}
print mem[ml]
- # for (i = ml; i in mem; i++) delete mem[i]
+ var["_"] = mem[ml--]
+ # for (i = ml; j in mem; i++) delete mem[i]
}