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
doubleproc double() {