diff options
| author | Marc Vertes <mvertes@free.fr> | 2025-07-30 19:07:07 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2025-07-30 19:07:07 +0200 |
| commit | b757984b8a8a865eb5cbd72008b91e66545f2c56 (patch) | |
| tree | f063bcf44e45e1e2aca5d24fa5b6e975920db901 | |
| parent | 443ec4b0e051e9c1966afb5367a69ec89ba2b8c7 (diff) | |
ev: improve naming
| -rwxr-xr-x | ev | 61 |
1 files changed, 31 insertions, 30 deletions
@@ -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] } |
