📄 ripreter.cpp
字号:
case gtr:
if ((e->operands)->s[(e->op)-1].ot != Long)
SoftwareError("RInterpret.Interpret:bad type on gtr");
(e->operands)->s[(e->op)-1].ot = Bool;
(e->operands)->s[(e->op)-1].type.b =
(((e->operands)->s[(e->op)-1]).type.l >= 1L);
INC(e->ip);
break;
case geq:
if ((e->operands)->s[(e->op)-1].ot != Long)
SoftwareError("RInterpret.Interpret:bad type on geq");
(e->operands)->s[(e->op)-1].ot = Bool;
(e->operands)->s[(e->op)-1].type.b =
((e->operands)->s[(e->op)-1].type.l >=0L);
INC(e->ip);
break;
case jpt:
ppu1 = ADR(e->code1) + LONG((e->ip)+1);
i = *ppu1;
INC((e->ip),3);
DEC(e->op);
if (((e->operands)->s[e->op]).ot == Bool)
{if (!((e->operands)->s[e->op].type.b)) INC((e->ip), i);}
else if ((e->operands)->s[e->op].ot == Long){
if (((e->operands)->s[e->op]).type.l == 0L) INC((e->ip), i);}
else
SoftwareError("RInterpret.Interpret:bad type on jpt");
break;
case lss:
if ((e->operands)->s[(e->op)-1].ot != Long)
SoftwareError("RInterpret.Interpret:bad type on lss");
(e->operands)->s[(e->op)-1].ot = Bool;
(e->operands)->s[(e->op)-1].type.b =
((e->operands)->s[(e->op)-1].type.l < 0L);
INC(e->ip);
break;
case leq:
if ((e->operands)->s[(e->op)-1].ot != Long)
SoftwareError("RInterpret.Interpret:bad type on leq");
(e->operands)->s[(e->op)-1].ot = Bool;
(e->operands)->s[(e->op)-1].type.b =
((e->operands)->s[(e->op)-1].type.l<=0L);
INC(e->ip);
break;
case cmp:
DEC(e->op);
if (((e->operands)->s[e->op]).ot != ((e->operands)->s[(e->op)-1]).ot)
compare((e->operands), (e->op));
else if (((e->operands)->s[e->op]).ot == Long){
if (((e->operands)->s[(e->op)-1]).type.l ==
((e->operands)->s[e->op]).type.l)
((e->operands)->s[(e->op)-1]).type.l = 0L;
else if ((((e->operands)->s[(e->op)-1]).type.l) >
((e->operands)->s[e->op]).type.l)
((e->operands)->s[(e->op)-1]).type.l = 1L;
else
((e->operands)->s[(e->op)-1]).type.l = -1L;
((e->operands)->s[(e->op)-1]).ot = Long;}
else if (((e->operands)->s[e->op]).ot == Real) {
if (((e->operands)->s[(e->op)-1]).type.r ==
((e->operands)->s[e->op]).type.r)
((e->operands)->s[(e->op)-1]).type.l = 0L;
else if (((e->operands)->s[(e->op)-1]).type.r >
((e->operands)->s[e->op]).type.r)
((e->operands)->s[(e->op)-1]).type.l = 1L;
else
((e->operands)->s[(e->op)-1]).type.l = -1L;
((e->operands)->s[(e->op)-1]).ot = Long;}
else
compare((e->operands), (e->op));
INC(e->ip);
break;
case stop: (e->operands)->top = e->op; e->ip = 0;
e->op = 0; e->dp = 1;
return (e->operands);
INC(e->ip);
break;
case call:
if (((e->operands)->s[(e->op)-1]).ot != Long)
SoftwareError("RInterpret.Interpret:bad call");
ppu1 = ADR(e->code1) + LONG((e->ip)+1);
i = *ppu1;
INC((e->ip),3);
(e->operands)->top = (e->op)-1;
Invoke(i,(TRUNC(((e->operands)->s[(e->op)-1]).type.l)),
(e->operands));
(e->op) = (e->operands)->top;
break;
case neg:
if ((e->operands)->s[(e->op)-1].ot == Long)
((e->operands)->s[(e->op)-1]).type.l =
-(((e->operands)->s[(e->op)-1]).type.l);
else if (((e->operands)->s[(e->op)-1]).ot == Real)
((e->operands)->s[(e->op)-1]).type.r =
-(((e->operands)->s[(e->op)-1]).type.r);
else{
(e->operands)->top = e->op;
Invoke((e->operands)->s[(e->op)-1].ot, ORD(neg),
(e->operands));
(e->op) = (e->operands)->top;}
INC(e->ip);
break;
case add:
if ((e->operands)->s[(e->op)-1].ot == Long){
INC((e->operands)->s[(e->op)-2].type.l,
(e->operands)->s[(e->op)-1].type.l);
DEC(e->op);}
else if ((e->operands)->s[(e->op)-1].ot == Real){
INC((e->operands)->s[(e->op)-2].type.r,
(e->operands)->s[(e->op)-1].type.r);
DEC(e->op);}
else{
(e->operands)->top = e->op;
Invoke((e->operands)->s[(e->op)-1].ot,
ORD(add), (e->operands));
e->op = (e->operands)->top;};
INC(e->ip);
break;
case sub:
if ((e->operands)->s[(e->op)-1].ot == Long){
DEC((e->operands)->s[(e->op)-2].type.l,
(e->operands)->s[(e->op)-1].type.l);
DEC(e->op);}
else if ((e->operands)->s[(e->op)-1].ot == Real){
DEC((e->operands)->s[(e->op)-2].type.r,
(e->operands)->s[(e->op)-1].type.r);
DEC(e->op);}
else{
(e->operands)->top = e->op;
Invoke((e->operands)->s[(e->op)-1].ot,
ORD(sub),(e->operands));
e->op = (e->operands)->top;};
INC(e->ip);
break;
case mul:
if ((e->operands)->s[(e->op)-1].ot == Long){
(e->operands)->s[(e->op)-2].type.l =
((e->operands)->s[(e->op)-2].type.l)*
((e->operands)->s[(e->op)-1]).type.l;
DEC(e->op);}
else if ((e->operands)->s[(e->op)-1].ot == Real){
((e->operands)->s[(e->op)-2]).type.r =
(((e->operands)->s[(e->op)-2]).type.r)*
((e->operands)->s[(e->op)-1]).type.r;
DEC(e->op);}
else{
(e->operands)->top = e->op;
Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(mul), (e->operands));
(e->op) = (e->operands)->top;};
INC(e->ip);
break;
case div: if ((e-> operands)->s[(e->op)-1].ot == Long) {
(e->operands)->s[(e->op)-2].type.l =
((e->operands)->s[(e->op)-2].type.l) /
((e->operands)->s[(e->op)-1]).type.l;
DEC(e->op);}
else if (((e->operands)->s[(e->op)-1]).ot == Real) {
((e->operands)->s[(e->op)-2]).type.r =
(((e->operands)->s[(e->op)-2]).type.r) /
((e->operands)->s[(e->op)-1]).type.r;
DEC(e->op);}
else{
(e->operands)->top = (e->op);
Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(div),
(e->operands));
e->op = (e->operands)->top;};
INC(e->ip);
break;
case mod: if (((e->operands)->s[(e->op)-1]).ot == Long) {
((e->operands)->s[(e->op)-2]).type.l =
(((e->operands)->s[(e->op)-2]).type.l) %
((e->operands)->s[(e->op)-1]).type.l;
DEC(e->op);}
else {
(e->operands)->top = e->op;
Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(mod),
(e->operands));
e->op = (e->operands)->top;};
INC(e->ip);
break;
case prn: {DEC(e->op);
INC(e->ip);
switch (((e->operands)->s[e->op]).ot) {
case Bool: if (((e->operands)->s[e->op]).type.b) printf("T");
else printf("F");
i = 0;
break;
case IChar: i = (e->operands)->s[e->op].type.il;
j = (e->operands)->s[e->op].ioffset;
break;
case Long: printf("%ld",((e->operands)->s[e->op]).type.l);
i = 0;
break;
case Real: printf("%f",((e->operands)->s[e->op]).type.r);
i = 0;
break;
}
for ( k = 1; k <= i; k++) {
Write((*((e->operands)->s[e->op].p))[j]);
INC(j);};
printf("\n");
break;
};
case lkf:
ppu1 = ADR(e->code1) + LONG((e->ip)+1);
i = *ppu1;
ppu2 = ADR(e->code1) + LONG((e->ip)+3);
k = *ppu2;
(e->operands)->top = e->op;
(e->attrProc)(i, k, (e->attrArg), (e->operands));
(e->op) = (e->operands)->top;
INC(e->op);
INC((e->ip),5);
break;
default:
printf("%d",(e->ip));
WriteString((e->code1));
printf("\n");
printf("RInterpret.Interpret:bad opcode\n");
INC(e->ip);
return(e->operands);
};/*end switch*/
}; /* loop */
}; /*RInterpret;*/
/******************************************************************************/
void p(unsigned int r,unsigned int k, ADDRESS a, pStack o)
{
printf("RInterpret.Interpret:missing attribute proc");
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -