diff options
| author | Marc Vertes <mvertes@free.fr> | 2025-07-30 10:34:23 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2025-07-30 10:34:23 +0200 |
| commit | 39b5ec2e0c34ecf86563cac4d920eacaca74fc79 (patch) | |
| tree | 5ea799d9374fe3c4d04a0a73d6fa0015ce347736 | |
| parent | 30a3865247db70d55eedb200a2175747f38c4143 (diff) | |
ev: implement assign
| -rwxr-xr-x | ev | 38 |
1 files changed, 29 insertions, 9 deletions
@@ -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] } |
