summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2025-07-30 19:07:07 +0200
committerMarc Vertes <mvertes@free.fr>2025-07-30 19:07:07 +0200
commitb757984b8a8a865eb5cbd72008b91e66545f2c56 (patch)
treef063bcf44e45e1e2aca5d24fa5b6e975920db901
parent443ec4b0e051e9c1966afb5367a69ec89ba2b8c7 (diff)
ev: improve naming
-rwxr-xr-xev61
1 files changed, 31 insertions, 30 deletions
diff --git a/ev b/ev
index c418ed5..7fcf207 100755
--- a/ev
+++ b/ev
@@ -13,10 +13,10 @@ BEGIN {
right["="] = right["+="] = right["-="] = right["*="] = right["/="] = right["%="] = right["^="] = 1
right["^"] = 1
- ml = pc = 0
+ sp = pc = 0 # sp: stack pointer, pc: program counter.
split("", code)
- split("", mem)
- split("", var)
+ split("", stack)
+ split("", sym)
printf "> "
}
{
@@ -46,65 +46,66 @@ function scan() {
return RLENGTH
}
-# TODO: unary operators
-function parse( stack, sl, i, b) {
+# TODO: unary operators, flow contror
+function parse( ops, sl, i, b) {
b = i = length(code)
while (scan() > 0) {
if (tok == "(") {
- stack[++sl] = tok
+ ops[++sl] = tok
} else if (tok == ")") {
- while (sl && stack[sl] != "(") code[i++] = stack[sl--]
+ while (sl && ops[sl] != "(") code[i++] = ops[sl--]
sl--
} else if (tok in prec) {
- # print "tok:" tok " ptok:" ptok
- if (tok ~ /[+-*\/%^]?=/ && ptok ~ /^v/) sub(/^v/, "p", code[i-1]) # hack: 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
+ # print "tok:" tok " ptok:" ptok
+ if (tok ~ /[+-*\/%^]?=/ && ptok ~ /^v/) sub(/^v/, "p", code[i-1]) # mutate var to pointer for assign
+ # Test precedence against ops, or associativity if same precedence.
+ while (sl && (prec[tok] < prec[ops[sl]] || prec[tok] == prec[ops[sl]] && !(ops[sl] in right))) {
+ code[i++] = ops[sl--]
+ }
+ ops[++sl] = tok
} else {
code[i++] = tok
}
}
- while (sl) code[i++] = stack[sl--]
+ while (sl) code[i++] = ops[sl--]
for (j = b; j < i; j++) printf("%s ", code[j]); print ""
}
# TODO: if, while, function
+# Feel like being a stack machine.
function run( c, i, l, t) {
cl = length(code)
while (pc < cl) {
c = code[pc]
if (c == "+") {
- mem[--ml] = mem[ml-1] + mem[ml]
+ stack[--sp] = stack[sp-1] + stack[sp]
} else if (c == "-") {
- mem[--ml] = mem[ml-1] - mem[ml]
+ stack[--sp] = stack[sp-1] - stack[sp]
} else if (c == "*") {
- mem[--ml] = mem[ml-1] * mem[ml]
+ stack[--sp] = stack[sp-1] * stack[sp]
} else if (c == "/") {
- mem[--ml] = mem[ml-1] / mem[ml]
+ stack[--sp] = stack[sp-1] / stack[sp]
} else if (c == "^") {
- mem[--ml] = mem[ml-1] ^ mem[ml]
+ stack[--sp] = stack[sp-1] ^ stack[sp]
} else if (c == "=") {
- mem[--ml] = var[substr(mem[ml-1], 2)] = mem[ml]
+ stack[--sp] = sym[substr(stack[sp-1], 2)] = stack[sp]
} else if (c == "+=") {
- mem[--ml] = var[substr(mem[ml-1], 2)] += mem[ml]
+ stack[--sp] = sym[substr(stack[sp-1], 2)] += stack[sp]
} else if (c ~ /^p/) {
- mem[++ml] = c
+ stack[++sp] = c
} else if (c ~ /^v/) {
- mem[++ml] = var[substr(c, 2)]
+ stack[++sp] = sym[substr(c, 2)]
} else if (c ~ /^[d]/) {
- mem[++ml] = 0 + substr(c, 2)
+ stack[++sp] = 0 + substr(c, 2)
} else {
print "run: invalid instruction " c
return
}
- # printf "c" pc ":%s", c; for (i = 1; i <= ml; i++) printf " " i ":" mem[i]; print ""
- # for (i in var) print "var[" i "]=" var[i]
+ # printf "c" pc ":%s", c; for (i = 1; i <= sp; i++) printf " " i ":" stack[i]; print ""
+ # for (i in sym) print "sym[" i "]=" sym[i]
pc++
}
- print var["_"] = mem[ml--]
- print "ml: " ml ", len(mem): " length(mem)
- # for (i = ml; j in mem; i++) delete mem[i]
+ print sym["_"] = stack[sp--]
+ print "sp: " sp ", len(stack): " length(stack)
+ # for (i = sp; j in stack; i++) delete stack[i]
}