{ /* term | term dyadic expr | */
term(a
|1); expv
+= lhs
; break;
term(a
|1); expv
= lhs
- expv
; break;
term(a
|1); expv
= round(lhs
,expv
); break;
term(a
|1); expv
*= lhs
; break;
term(a
|1); expv
= lhs
/expv
; break;
term(a
|1); expv
&= lhs
; break;
term(a
|1); expv
|= lhs
; break;
IF (a
&2)==0 THEN
error(BADKET
); FI
{ /* item | monadic item | (expr) | */
term(a
|1); expv
=chkget(expv
,DSP
); return(1);
term(a
|1); expv
=chkget(expv
,ISP
); return(1);
term(a
|1); expv
= -expv
; return(1);
term(a
|1); expv
= ~expv
; return(1);
{ /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
INT base
, d
, frpt
, regptr
;
UNION
{REAL r
; L_INT i
;} real
;
THEN frame
=endhdr
[r5
]&EVEN
; lastframe
=0; callpc
=endhdr
[pc
];
IF
eqsym(symbol
.symc
,isymbol
,'~')
frame
=get(frame
,DSP
)&EVEN
;
savlastf
=lastframe
; savframe
=frame
;
ELIF (symp
=lookupsym(isymbol
))==0 THEN
error(BADSYM
);
ELIF
digit(lastc
) ORF (hex
=TRUE
, lastc
=='#' ANDF
hexdigit(readchar()))
base
= (lastc
== '0' ORF octal
? 8 : (hex
? 16 : 10));
WHILE (hex
? hexdigit(lastc
) : digit(lastc
))
IF (d
=convdig(lastc
))>=base THEN
error(BADSYN
); FI
IF expv
==0 ANDF (lastc
=='x' ORF lastc
=='X')
THEN hex
=TRUE
; base
=16; readchar();
IF lastc
=='.' ANDF (base
==10 ORF expv
==0) ANDF
!hex
THEN real
.r
=expv
; frpt
=0; base
=10;
DO real
.r
*= base
; frpt
++;
THEN lastframe
=savlastf
; callpc
=savpc
; findroutine(savframe
);
THEN expv
=inkdot(dotinc
);
THEN expv
=inkdot(-dotinc
);
THEN expv
=endhdr
[regptr
];
ELIF (base
=varchk(savc
)) != -1
THEN IF d
==1 THEN expv
=<<16; FI
expv
|= ((d
&1)?lastc
:lastc
<<8);
/* service routines for expression reading */
WHILE p
< &isymbol
[8] DO
*p
++ = 0; OD
DO
IF (symp
->symf
&SYMCHK
)==symp
->symf
ANDF
eqsym(symp
->symc
, symstr
,'_')
{ return((c
>='0' ANDF c
<='9') ORF (c
>='a' ANDF c
<='f'));
digit(c
) char c
; {return(c
>='0' ANDF c
<='9');}
letter(c
) char c
; {return(c
>='a' ANDF c
<='z' ORF c
>='A' ANDF c
<='Z');}
IF lastc
=='\\' THEN
readchar(); return(TRUE
); FI
return( letter(lastc
) ORF lastc
=='_' ORF dig ANDF
digit(lastc
) );
IF
digit(name
) THEN
return(name
-'0'); FI
IF
letter(name
) THEN
return((name
&037)-1+10); FI
REP IF
localsym(frame
)==0 THEN
error(BADLOC
); FI
PER
!eqsym(symbol
.symc
,isymbol
,'~') DONE