Чтение онлайн

ЖАНРЫ

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;

Поделиться с друзьями: