Шрифт:
}
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)) {