initial version

This commit is contained in:
2021-01-20 16:22:59 +01:00
commit 0b6c839b4d
8 changed files with 534 additions and 0 deletions

62
eval.c Normal file
View File

@@ -0,0 +1,62 @@
#include <stdio.h>
#include "lceb.h"
int eval_cell(pos)
STACKELT *pos;
{
STACKELT *prev=pos-1;
int curop=pos->curop, nop=pos->nop;
int val1, val2;
char op;
int res;
while (curop<nop) {
op=pos->op[curop];
val2=pos->val;
res=-1;
printf("eval_cell(%c, %d)\n", op, val2);
while ((val1=prev->val) == -1)
prev--;
switch (op) {
case Nop:
case End:
return val2;
break;
case Add:
res=val1+val2;
break;
case Mul:
res=val1*val2;
break;
case Sub:
if (val1 > val2)
res=val1-val2;
break;
case Div:
if (val1 > val2 && (val1 % val2 == 0))
res=val1/val2;
break;
}
curop++;
if (res==-1)
break;
pos->val=res;
printf("\t--> eval=%d\n", res);
}
return res;
}
int eval_stack(stack)
STACK *stack;
{
int pos, last=stack->last, res;
STACKELT *pstack=stack->stack;
printf("+++++ eval_stack: addr=%p\n", pstack);
for (pos=1; pos<last; ++pos) {
//printf("eval_stack(%d/%d): addr=%p\n", pos, stack->last, pstack+pos);
res=eval_cell(stack->stack+pos);
//printf(" -> val(%d)=%d\n", pos, res);
}
return res;
}