static char sccsid
[] = "@(#)expr.c 1.2 (Berkeley) %G%";
{ /* term | term dyadic expr | */
switch ((int)readchar()) {
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) | */
switch ((int)readchar()) {
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);
term(a
|1); expv
= !expv
; return(1);
{ /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
register struct nlist
*symp
;
THEN frame
= *(ADDR
*)(((ADDR
)(&u
))+FP
); lastframe
=0;
callpc
= *(ADDR
*)(((ADDR
)(&u
))+PC
);
IF
eqsym(cursym
->n_un
.n_name
,isymbol
,'~')
callpc
=get(frame
-8, DSP
);
frame
=get(frame
, DSP
)&ALIGN
;
savlastf
=lastframe
; savframe
=frame
;
ELIF (symp
=lookup(isymbol
))==0 THEN
error(BADSYM
);
ELSE expv
= symp
->n_value
;
THEN lastframe
=savlastf
; callpc
=savpc
;
THEN expv
=inkdot(dotinc
);
THEN expv
=inkdot(-dotinc
);
IF (regptr
=getreg(savc
)) != -1
THEN IF kcore THEN expv
= *(int *)regptr
;
ELSE expv
= *(ADDR
*)(((ADDR
)(&u
))+regptr
); FI
ELIF (base
=varchk(savc
)) != -1
/* service routines for expression reading */
UNION
{REAL r
; L_INT i
;} real
;
IF (base
= radix
) < 0 THEN base
= -base
; FI
WHILE (base
>10 ? isxdigit(lastc
) : isdigit(lastc
))
expv
= (expv
-m
)*base
+m
*base
;
IF (d
=convdig(lastc
))>=base ORF d
<0 THEN
error(BADSYN
); FI
THEN
IF (lastc
=='x' ORF lastc
=='X')
THEN base
=16; readchar();
ELIF (lastc
=='t' ORF lastc
=='T')
THEN base
=10; readchar();
ELIF (lastc
=='o' ORF lastc
=='O')
IF lastc
=='.' ANDF (base
==10 ORF expv
==0)
THEN real
.r
=expv
; frpt
=0; base
=10;
WHILE
isdigit(readchar())
DO real
.r
*= base
; frpt
++;
REP IF p
< &isymbol
[sizeof(isymbol
)-1]
IF lastc
=='\\' THEN
readchar(); return(TRUE
); FI
return ( isalpha(lastc
) ORF lastc
=='_' ORF dig ANDF
isdigit(lastc
) );
IF
isdigit(name
) THEN
return(name
-'0'); FI
IF
isalpha(name
) THEN
return((name
&037)-1+10); FI
REP IF
localsym(frame
)==0 THEN
error(BADLOC
); FI
PER
!eqsym(cursym
->n_un
.n_name
,isymbol
,'~') DONE
if (*s1
== c
&& !strcmp(s1
+1, s2
))