if (d.sym-type != VAR d.sym-type != UNDEF)
execerror("attempt to evaluate non-variable", d.sym-name);
if (d.sym-type == UNDEF)
execerror("undefined variable", d.sym-name);
d.val = d.sym-u.val;
push(d);
}
add {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val += d2.val;
push(d1);
}
sub {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val -= d2.val;
push(d1);
}
mul {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val *= d2.val;
push(d1);
}
div {
Datum d1, d2;
d2 = pop;
if (d2.val == 0.0)
execerror("division by zero", (char *)0);
d1 = pop;
d1.val /= d2.val;
push(d1);
}
negate {
Datum d;
d = pop;
d.val = -d.val;
push(d);
}
gt {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val d2.val);
push(d1);
}
lt {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val d2.val);
push(d1);
}
ge {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val = d2.val);
push(d1);
}
le {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val = d2.val);
push(d1);
}
eq {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val == d2.val);
push(d1);
}
ne {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != d2.val);
push(d1);
}
and {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != 0.0 d2.val != 0.0);
push(d1);
}
or {
Datum d1, d2;
d2 = pop;
d1 = pop;
d1.val = (double)(d1.val != 0.0 || d2.val != 0.0);
push(d1);
}
not {
Datum d;
d = pop;
d.val = (double)(d.val == 0.0);
push(d);
}
power {
Datum d1, d2;
extern double Pow;
d2 = pop;
d1 = pop;
d1.val = Pow(d1.val, d2.val);
push(d1);
}
assign {
Datum d1, d2;
d1 = pop;
d2 = pop;
if (d1.sym-type != VAR d1.sym-type != UNDEF)
execerror("assignment to non-variable", d1.sym-name);
d1.sym-u.val = d2.val;
d1.sym-type = VAR;
push(d2);
}
print /* pop top value from stack, print it */
{
Datum d;
d = pop;
printf("\t%.8g\n", d.val);
}
prexpr /* print numeric value */
{
Datum d;
d = pop;
printf("%.8g ", d.val);
}
prstr /* print string value */
{
printf(%s", (char*)*pc++);
}
varread /* read into variable */
{
Datum d;
extern FILE *fin;
Symbol *var = (Symbol*)*pc++;
Again:
switch (fscanf(fin, "%lf", var-u.val)) {
case EOF:
if (moreinput)
goto Again;
d.val = var-u.val = 0.0;
break;
case 0:
execerror("non-number read into", var-name);
break;
default:
d.val = 1.0;
break;
}
var-type = VAR;
push(d);
}
Inst *code(f) /* install one instruction or operand */
Inst f;
{
Inst *oprogp = progp;
if (progp = prog[NPROG])
execerror("program too big", (char*)0);
*progp++ = f;
return oprogp;
}
execute(p)
Inst *p;
{
for (pc = p; *pc != STOP !returning; )
(*((++pc)[-1]));
}
3.7.4 double
proc double {
if ($1 1) {
double($1/2)
}
print($1)
}
double(1024)
3.7.5 fac
func fac {
if ($1 = 0) return 1 else return $1 * fac($1-1)
}
3.7.6 fac1