UNIX — универсальная среда программирования
Шрифт:
{
Datum d;
d.val = *getarg;
push(d);
}
argassign /* store top of stack in argument */
{
Datum d;
d = pop;
push(d); /* leave value on stack */
*getarg = d.val;
}
bltin {
Datum d;
d = pop;
d.val = (*(double(*))*pc++)(d.val);
push(d);
}
eval /* evaluate variable on stack */
{
Datum d;
d = pop;
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;
Поделиться с друзьями: