init
This commit is contained in:
parent
dbb93eacff
commit
d2270d144b
@ -1,4 +1,9 @@
|
||||
legacy-cc
|
||||
=========
|
||||
|
||||
The earliest versions of the very first c compiler known to exist in the wild written by the late legend himself dmr.
|
||||
The earliest versions of the very first c compiler known to exist in the wild written by the late legend himself dmr.
|
||||
|
||||
These are not capable of being compiled today with modern c compilers like gcc. I am only posting these here for the enjoyment and reminiscing of the spark that ignited a soon to be trillion dollar industry. Enjoy. :)
|
||||
|
||||
|
||||
Source: [http://cm.bell-labs.com/cm/cs/who/dmr/primevalC.html]
|
||||
|
581
last1120c/c00.c
Normal file
581
last1120c/c00.c
Normal file
@ -0,0 +1,581 @@
|
||||
/* C compiler
|
||||
|
||||
Copyright 1972 Bell Telephone Laboratories, Inc.
|
||||
|
||||
*/
|
||||
|
||||
ossiz 250;
|
||||
ospace() {} /* fake */
|
||||
|
||||
init(s, t)
|
||||
char s[]; {
|
||||
extern lookup, symbuf, namsiz;
|
||||
char symbuf[], sp[];
|
||||
int np[], i;
|
||||
|
||||
i = namsiz;
|
||||
sp = symbuf;
|
||||
while(i--)
|
||||
if ((*sp++ = *s++)=='\0') --s;
|
||||
np = lookup();
|
||||
*np++ = 1;
|
||||
*np = t;
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
int argv[]; {
|
||||
extern init, flush;
|
||||
extern extdef, eof, open, creat;
|
||||
extern fout, fin, error, exit, nerror, tmpfil;
|
||||
|
||||
if(argc<4) {
|
||||
error("Arg count");
|
||||
exit(1);
|
||||
}
|
||||
if((fin=open(argv[1],0))<0) {
|
||||
error("Can't find %s", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if((fout=creat(argv[2], 017))<0) {
|
||||
error("Can't create %s", argv[2]);
|
||||
exit(1);
|
||||
}
|
||||
tmpfil = argv[3];
|
||||
init("int", 0);
|
||||
init("char", 1);
|
||||
init("float", 2);
|
||||
init("double", 3);
|
||||
/* init("long", 4); */
|
||||
init("auto", 5);
|
||||
init("extern", 6);
|
||||
init("static", 7);
|
||||
init("goto", 10);
|
||||
init("return", 11);
|
||||
init("if", 12);
|
||||
init("while", 13);
|
||||
init("else", 14);
|
||||
init("switch", 15);
|
||||
init("case", 16);
|
||||
init("break", 17);
|
||||
init("continue", 18);
|
||||
init("do", 19);
|
||||
init("default", 20);
|
||||
while(!eof) {
|
||||
extdef();
|
||||
blkend();
|
||||
}
|
||||
flush();
|
||||
flshw();
|
||||
exit(nerror!=0);
|
||||
}
|
||||
|
||||
lookup() {
|
||||
extern hshtab[], hshsiz, pssiz, symbuf[];
|
||||
extern hshlen, hshused, exit, error, nwps;
|
||||
auto i, j, np[], sp[], rp[];
|
||||
|
||||
i = 0;
|
||||
sp = symbuf;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
i =+ *sp++;
|
||||
if (i<0) i = -i;
|
||||
i =% hshsiz;
|
||||
i =* pssiz;
|
||||
while(*(np = &hshtab[i+4])) {
|
||||
sp = symbuf;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
if (*np++ != *sp++) goto no;
|
||||
return(&hshtab[i]);
|
||||
no: if ((i =+ pssiz) >= hshlen) i = 0;
|
||||
}
|
||||
if(hshused++ > hshsiz) {
|
||||
error("Symbol table overflow");
|
||||
exit(1);
|
||||
}
|
||||
rp = np = &hshtab[i];
|
||||
sp = symbuf;
|
||||
j = 4;
|
||||
while(j--)
|
||||
*np++ = 0;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
*np++ = *sp++;
|
||||
return(rp);
|
||||
}
|
||||
|
||||
symbol() {
|
||||
extern peeksym, peekc, eof, getchar, subseq, error, line;
|
||||
extern csym[], getstr, symbuf, namsiz, lookup[], ctab, cval;
|
||||
auto b, c;
|
||||
char symbuf[], sp[], ctab[];
|
||||
|
||||
if (peeksym>=0) {
|
||||
c = peeksym;
|
||||
peeksym = -1;
|
||||
return(c);
|
||||
}
|
||||
if (peekc) {
|
||||
c = peekc;
|
||||
peekc = 0;
|
||||
} else
|
||||
if (eof)
|
||||
return(0); else
|
||||
c = getchar();
|
||||
loop:
|
||||
switch(ctab[c]) {
|
||||
|
||||
case 125: /* newline */
|
||||
line++;
|
||||
|
||||
case 126: /* white space */
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
case 0: /* EOF */
|
||||
eof++;
|
||||
return(0);
|
||||
|
||||
case 40: /* + */
|
||||
return(subseq(c,40,30));
|
||||
|
||||
case 41: /* - */
|
||||
return(subseq(c,41,31));
|
||||
|
||||
case 80: /* = */
|
||||
if (subseq(' ',0,1)) return(80);
|
||||
c = symbol();
|
||||
if (c>=40 & c<=49)
|
||||
return(c+30);
|
||||
if (c==80)
|
||||
return(60);
|
||||
peeksym = c;
|
||||
return(80);
|
||||
|
||||
case 63: /* < */
|
||||
if (subseq(c,0,1)) return(46);
|
||||
return(subseq('=',63,62));
|
||||
|
||||
case 65: /* > */
|
||||
if (subseq(c,0,1)) return(45);
|
||||
return(subseq('=',65,64));
|
||||
|
||||
case 34: /* ! */
|
||||
return(subseq('=',34,61));
|
||||
|
||||
case 43: /* / */
|
||||
if (subseq('*',1,0))
|
||||
return(43);
|
||||
com:
|
||||
c = getchar();
|
||||
com1:
|
||||
if (c=='\0') {
|
||||
eof++;
|
||||
error("Nonterminated comment");
|
||||
return(0);
|
||||
}
|
||||
if (c=='\n')
|
||||
line++;
|
||||
if (c!='*')
|
||||
goto com;
|
||||
c = getchar();
|
||||
if (c!='/')
|
||||
goto com1;
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
case 124: /* number */
|
||||
cval = 0;
|
||||
if (c=='0')
|
||||
b = 8; else
|
||||
b = 10;
|
||||
while(ctab[c]==124) {
|
||||
cval = cval*b + c -'0';
|
||||
c = getchar();
|
||||
}
|
||||
peekc = c;
|
||||
return(21);
|
||||
|
||||
case 122: /* " */
|
||||
return(getstr());
|
||||
|
||||
case 121: /* ' */
|
||||
return(getcc());
|
||||
|
||||
case 123: /* letter */
|
||||
sp = symbuf;
|
||||
while(ctab[c]==123 | ctab[c]==124) {
|
||||
if (sp<symbuf+namsiz) *sp++ = c;
|
||||
c = getchar();
|
||||
}
|
||||
while(sp<symbuf+namsiz)
|
||||
*sp++ = '\0';
|
||||
peekc = c;
|
||||
csym = lookup();
|
||||
if (csym[0]==1) { /* keyword */
|
||||
cval = csym[1];
|
||||
return(19);
|
||||
}
|
||||
return(20);
|
||||
|
||||
case 127: /* unknown */
|
||||
error("Unknown character");
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
}
|
||||
return(ctab[c]);
|
||||
}
|
||||
|
||||
subseq(c,a,b) {
|
||||
extern getchar, peekc;
|
||||
|
||||
if (!peekc)
|
||||
peekc = getchar();
|
||||
if (peekc != c)
|
||||
return(a);
|
||||
peekc = 0;
|
||||
return(b);
|
||||
}
|
||||
getstr() {
|
||||
extern isn, cval;
|
||||
auto c;
|
||||
|
||||
printf(".data;L%d:.byte ", cval=isn++);
|
||||
while((c=mapch('"')) >= 0)
|
||||
printf("%o,", c);
|
||||
printf("0;.even;.text\n");
|
||||
return(22);
|
||||
}
|
||||
|
||||
getcc()
|
||||
{
|
||||
extern cval, ncpw;
|
||||
auto c, cc;
|
||||
char cp[];
|
||||
|
||||
cval = 0;
|
||||
cp = &cval;
|
||||
cc = 0;
|
||||
while((c=mapch('\'')) >= 0)
|
||||
if(cc++ < ncpw)
|
||||
*cp++ = c;
|
||||
if(cc>ncpw)
|
||||
error("Long character constant");
|
||||
return(21);
|
||||
}
|
||||
|
||||
mapch(c)
|
||||
{
|
||||
extern peekc, line;
|
||||
auto a;
|
||||
|
||||
if((a=getchar())==c)
|
||||
return(-1);
|
||||
switch(a) {
|
||||
|
||||
case '\n':
|
||||
case 0:
|
||||
error("Nonterminated string");
|
||||
peekc = a;
|
||||
return(-1);
|
||||
|
||||
case '\\':
|
||||
switch (a=getchar()) {
|
||||
|
||||
case 't':
|
||||
return('\t');
|
||||
|
||||
case 'n':
|
||||
return('\n');
|
||||
|
||||
case '0':
|
||||
return('\0');
|
||||
|
||||
case 'r':
|
||||
return('\r');
|
||||
|
||||
case '\n':
|
||||
line++;
|
||||
return('\n');
|
||||
}
|
||||
|
||||
}
|
||||
return(a);
|
||||
}
|
||||
|
||||
tree() {
|
||||
extern symbol, block, csym[], ctyp, isn,
|
||||
peeksym, opdope[], build, error, cp[], cmst[],
|
||||
space, ospace, cval, ossiz, exit, errflush, cmsiz;
|
||||
|
||||
auto op[], opst[20], pp[], prst[20], andflg, o,
|
||||
p, ps, os;
|
||||
|
||||
space = ospace;
|
||||
op = opst;
|
||||
pp = prst;
|
||||
cp = cmst;
|
||||
*op = 200; /* stack EOF */
|
||||
*pp = 06;
|
||||
andflg = 0;
|
||||
|
||||
advanc:
|
||||
switch (o=symbol()) {
|
||||
|
||||
/* name */
|
||||
case 20:
|
||||
if (*csym==0)
|
||||
if((peeksym=symbol())==6)
|
||||
*csym = 6; /* extern */
|
||||
else {
|
||||
if(csym[2]==0) /* unseen so far */
|
||||
csym[2] = isn++;
|
||||
}
|
||||
if(*csym==6) /* extern */
|
||||
*cp++ = block(5,20,csym[1],0,*csym,
|
||||
csym[4],csym[5],csym[6],csym[7]);
|
||||
else
|
||||
*cp++ = block(2,20,csym[1],0,*csym,csym[2]);
|
||||
goto tand;
|
||||
|
||||
/* short constant */
|
||||
case 21:
|
||||
case21:
|
||||
*cp++ = block(1,21,ctyp,0,cval);
|
||||
goto tand;
|
||||
|
||||
/* string constant */
|
||||
case 22:
|
||||
*cp++ = block(1,22,17,0,cval);
|
||||
|
||||
tand:
|
||||
if(cp>=cmst+cmsiz) {
|
||||
error("Expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
if (andflg)
|
||||
goto syntax;
|
||||
andflg = 1;
|
||||
goto advanc;
|
||||
|
||||
/* ++, -- */
|
||||
case 30:
|
||||
case 31:
|
||||
if (andflg)
|
||||
o =+ 2;
|
||||
goto oponst;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
if (andflg)
|
||||
goto syntax;
|
||||
goto oponst;
|
||||
|
||||
/* - */
|
||||
case 41:
|
||||
if (!andflg) {
|
||||
peeksym = symbol();
|
||||
if (peeksym==21) {
|
||||
peeksym = -1;
|
||||
cval = -cval;
|
||||
goto case21;
|
||||
}
|
||||
o = 37;
|
||||
}
|
||||
andflg = 0;
|
||||
goto oponst;
|
||||
|
||||
/* & */
|
||||
/* * */
|
||||
case 47:
|
||||
case 42:
|
||||
if (andflg)
|
||||
andflg = 0; else
|
||||
if(o==47)
|
||||
o = 35;
|
||||
else
|
||||
o = 36;
|
||||
goto oponst;
|
||||
|
||||
/* ( */
|
||||
case 6:
|
||||
if (andflg) {
|
||||
o = symbol();
|
||||
if (o==7)
|
||||
o = 101; else {
|
||||
peeksym = o;
|
||||
o = 100;
|
||||
andflg = 0;
|
||||
}
|
||||
}
|
||||
goto oponst;
|
||||
|
||||
/* ) */
|
||||
/* ] */
|
||||
case 5:
|
||||
case 7:
|
||||
if (!andflg)
|
||||
goto syntax;
|
||||
goto oponst;
|
||||
}
|
||||
|
||||
/* binaries */
|
||||
if (!andflg)
|
||||
goto syntax;
|
||||
andflg = 0;
|
||||
|
||||
oponst:
|
||||
p = (opdope[o]>>9) & 077;
|
||||
opon1:
|
||||
ps = *pp;
|
||||
if (p>ps | p==ps & (opdope[o]&0200)!=0) { /* right-assoc */
|
||||
putin:
|
||||
switch (o) {
|
||||
|
||||
case 6: /* ( */
|
||||
case 4: /* [ */
|
||||
case 100: /* call */
|
||||
p = 04;
|
||||
}
|
||||
if(op>=opst+20) { /* opstack size */
|
||||
error("expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
*++op = o;
|
||||
*++pp = p;
|
||||
goto advanc;
|
||||
}
|
||||
--pp;
|
||||
switch (os = *op--) {
|
||||
|
||||
/* EOF */
|
||||
case 200:
|
||||
peeksym = o;
|
||||
return(*--cp);
|
||||
|
||||
/* call */
|
||||
case 100:
|
||||
if (o!=7)
|
||||
goto syntax;
|
||||
build(os);
|
||||
goto advanc;
|
||||
|
||||
/* mcall */
|
||||
case 101:
|
||||
*cp++ = 0; /* 0 arg call */
|
||||
os = 100;
|
||||
goto fbuild;
|
||||
|
||||
/* ( */
|
||||
case 6:
|
||||
if (o!=7)
|
||||
goto syntax;
|
||||
goto advanc;
|
||||
|
||||
/* [ */
|
||||
case 4:
|
||||
if (o!=5)
|
||||
goto syntax;
|
||||
build(4);
|
||||
goto advanc;
|
||||
}
|
||||
fbuild:
|
||||
build(os);
|
||||
goto opon1;
|
||||
|
||||
syntax:
|
||||
error("Expression syntax");
|
||||
errflush(o);
|
||||
return(0);
|
||||
}
|
||||
|
||||
declare(kw) {
|
||||
extern csym[], symbol, paraml[], parame[];
|
||||
extern error, cval, errflush, peeksym, exit;
|
||||
int t[], n, o;
|
||||
|
||||
while((o=symbol())==20) { /* name */
|
||||
if(kw>=5) { /* type or sort? */
|
||||
if(*csym>0)
|
||||
error("%p redeclared", csym[4]);
|
||||
*csym = kw;
|
||||
} else {
|
||||
if ((csym[1]&017)!=0)
|
||||
error("%p redeclared", &csym[4]);
|
||||
csym[1] =| csym[1]&0760 | kw;
|
||||
if (*csym==0)
|
||||
*csym = -2;
|
||||
}
|
||||
while((o=symbol())==4) { /* [ */
|
||||
if((o=symbol())==21) { /* const */
|
||||
if(csym[1]>=020)
|
||||
error("Bad vector");
|
||||
csym[3] = cval;
|
||||
o = symbol();
|
||||
}
|
||||
if (o!=5) /* ] */
|
||||
goto syntax;
|
||||
csym[1] =+ 020;
|
||||
}
|
||||
if(kw==8) { /* parameter */
|
||||
*csym = -1;
|
||||
if (paraml==0)
|
||||
paraml = csym;
|
||||
else
|
||||
*parame = csym;
|
||||
parame = csym;
|
||||
}
|
||||
if (o!=9) /* , */
|
||||
break;
|
||||
}
|
||||
if(o==1 & kw!=8 | o==7 & kw==8)
|
||||
return;
|
||||
syntax:
|
||||
error("Declaration syntax");
|
||||
errflush(o);
|
||||
}
|
||||
|
||||
/* storage */
|
||||
|
||||
regtab 0;
|
||||
efftab 1;
|
||||
cctab 2;
|
||||
sptab 3;
|
||||
symbuf[4];
|
||||
pssiz 8;
|
||||
namsiz 8;
|
||||
nwps 4;
|
||||
hshused 0;
|
||||
hshsiz 100;
|
||||
hshlen 800; /* 8*hshsiz */
|
||||
hshtab[800];
|
||||
space 0;
|
||||
cp 0;
|
||||
cmsiz 40;
|
||||
cmst[40];
|
||||
ctyp 0;
|
||||
isn 1;
|
||||
swsiz 120;
|
||||
swtab[120];
|
||||
swp 0;
|
||||
contlab 0;
|
||||
brklab 0;
|
||||
deflab 0;
|
||||
nreg 4;
|
||||
maprel[] 60,61,64,65,62,63,68,69,66,67;
|
||||
nauto 0;
|
||||
stack 0;
|
||||
peeksym 0177777;
|
||||
peekc 0;
|
||||
eof 0;
|
||||
line 1;
|
||||
csym 0;
|
||||
cval 0;
|
||||
ncpw 2;
|
||||
nerror 0;
|
||||
paraml;
|
||||
parame;
|
||||
tmpfil;
|
||||
|
210
last1120c/c01.c
Normal file
210
last1120c/c01.c
Normal file
@ -0,0 +1,210 @@
|
||||
build(op) {
|
||||
extern cp[], error, block, opdope[], maprel[], chklval;
|
||||
extern chkw, cvtab, lintyp, dcalc;
|
||||
auto p1[], t1, d1, p2[], t2, d2, p3[], t3, d3, t;
|
||||
auto d, dope, lr, cvn;
|
||||
char cvtab[];
|
||||
|
||||
if (op==4) { /* [] */
|
||||
build(40); /* + */
|
||||
op = 36;
|
||||
}
|
||||
dope = opdope[op];
|
||||
if ((dope&01)!=0) {
|
||||
p2 = *--cp;
|
||||
t2 = p2[1];
|
||||
d2 = p2[2];
|
||||
}
|
||||
p1 = *--cp;
|
||||
t1 = p1[1];
|
||||
d1 = p1[2];
|
||||
switch (op) {
|
||||
|
||||
/* , */
|
||||
case 9:
|
||||
*cp++ = block(2, 9, 0, 0, p1, p2);
|
||||
return;
|
||||
|
||||
/* ? */
|
||||
case 90:
|
||||
if (*p2!=8)
|
||||
error("Illegal conditional");
|
||||
goto goon;
|
||||
|
||||
/* call */
|
||||
case 100:
|
||||
*cp++ = block(2,100,t1,24,p1,p2);
|
||||
return;
|
||||
|
||||
/* * */
|
||||
case 36:
|
||||
if ((t1 =- 16)<0) {
|
||||
error("Illegal indirection");
|
||||
t1 =+ 16;
|
||||
}
|
||||
if (*p1!=20 & d1==0)
|
||||
d1 = 1;
|
||||
*cp++ = block(1,36,t1,d1,p1);
|
||||
return;
|
||||
|
||||
/* & unary */
|
||||
case 35:
|
||||
if (*p1 == 36) { /* * */
|
||||
*cp++ = p1[3];
|
||||
return;
|
||||
}
|
||||
if (*p1 == 20) {
|
||||
*cp++ = block(1,p1[3]==5?29:35,t1+16,1,p1);
|
||||
return;
|
||||
}
|
||||
error("Illegal lvalue");
|
||||
}
|
||||
goon:
|
||||
if ((dope&02)!=0) /* lvalue needed on left? */
|
||||
chklval(p1);
|
||||
if ((dope&020)!=0) /* word operand on left? */
|
||||
chkw(p1);
|
||||
if ((dope&040)!=0) /* word operand on right? */
|
||||
chkw(p2);
|
||||
if ((dope&01)!=0) { /* binary op? */
|
||||
cvn = cvtab[9*lintyp(t1)+lintyp(t2)];
|
||||
if ((dope&010)!=0) { /* assignment? */
|
||||
t = t1;
|
||||
lr = 1;
|
||||
cvn =& 07;
|
||||
} else {
|
||||
t = (cvn&0100)!=0? t2:t1;
|
||||
lr = cvn&0200;
|
||||
cvn = (cvn>>3)&07;
|
||||
}
|
||||
if (cvn) {
|
||||
if (cvn==07) {
|
||||
error("Illegal conversion");
|
||||
goto nocv;
|
||||
}
|
||||
cvn =+ (dope&010)!=0? 83:93;
|
||||
if (lr) {
|
||||
t2 = t;
|
||||
d2 = (p2=convert(p2, t, d2, cvn))[2];
|
||||
} else {
|
||||
t1 = t;
|
||||
d1 = (p1=convert(p1, t, d1, cvn))[2];
|
||||
}
|
||||
nocv:; }
|
||||
if (d2>d1 & (dope&0100)!=0) { /* flip commutative? */
|
||||
if ((dope&04)!=0) /* relational? */
|
||||
op = maprel[op-60];
|
||||
d = d1;
|
||||
d1 = d2;
|
||||
d2 = d;
|
||||
d = p1;
|
||||
p1 = p2;
|
||||
p2 = d;
|
||||
d = t1;
|
||||
t1 = t2;
|
||||
t2 = d;
|
||||
}
|
||||
if (d1==d2)
|
||||
d = d1+1; else
|
||||
d = max(d1,d2);
|
||||
if ((dope&04)!=0)
|
||||
t = 0; /* relational is integer */
|
||||
*cp++ = block(2,op,t,d,p1,p2);
|
||||
return;
|
||||
}
|
||||
*cp++ = block(1,op,t1,d1==0?1:d1,p1);
|
||||
}
|
||||
|
||||
convert(p, t, d, cvn)
|
||||
int p[];
|
||||
{
|
||||
auto c;
|
||||
if (*p==21) { /* constant */
|
||||
c = p[3];
|
||||
switch(cvn) {
|
||||
|
||||
case 99: /* c18 */
|
||||
c =<< 1;
|
||||
|
||||
case 98: /* c14 */
|
||||
c =<< 1;
|
||||
|
||||
case 97: /* c12 */
|
||||
c =<< 1;
|
||||
|
||||
p[3] = c;
|
||||
return(p);
|
||||
}
|
||||
}
|
||||
return(block(1, cvn, t, max(1,d), p));
|
||||
}
|
||||
|
||||
chkw(p)
|
||||
int p[]; {
|
||||
extern error;
|
||||
auto t;
|
||||
|
||||
if ((t=p[1])>1 & t<16)
|
||||
error("Integer operand required");
|
||||
return;
|
||||
}
|
||||
|
||||
lintyp(t) {
|
||||
return(t<16? t:(t<32? t-12: 8));
|
||||
}
|
||||
|
||||
error(s, p1, p2) {
|
||||
extern printf, line, fout, flush, putchar, nerror;
|
||||
int f;
|
||||
|
||||
nerror++;
|
||||
flush();
|
||||
f = fout;
|
||||
fout = 1;
|
||||
printf("%d: ", line);
|
||||
printf(s, p1, p2);
|
||||
putchar('\n');
|
||||
fout = f;
|
||||
}
|
||||
|
||||
block(n, op, t, d, p1,p2,p3)
|
||||
int p1[],p2[],p3[]; {
|
||||
extern space[], error, exit, ossiz, ospace[];
|
||||
auto p[], ap[];
|
||||
|
||||
p = space;
|
||||
ap = &op;
|
||||
n =+ 3;
|
||||
if(space+n >= ospace+ossiz) {
|
||||
error("Expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
while(n--)
|
||||
*space++ = *ap++;
|
||||
return(p);
|
||||
}
|
||||
|
||||
chklval(p)
|
||||
int p[]; {
|
||||
extern error;
|
||||
if (*p!=20)
|
||||
if (*p!=36)
|
||||
error("Lvalue required");
|
||||
}
|
||||
|
||||
notcompat(at, st) {
|
||||
|
||||
if (st==0) /* word, byte */
|
||||
return(at>1 & at<16);
|
||||
if (st==1) /* word */
|
||||
return(at>0 & at<16);
|
||||
return((st-2) != at);
|
||||
}
|
||||
|
||||
max(a, b)
|
||||
{
|
||||
if (a>b)
|
||||
return(a);
|
||||
return(b);
|
||||
}
|
||||
|
436
last1120c/c02.c
Normal file
436
last1120c/c02.c
Normal file
@ -0,0 +1,436 @@
|
||||
function() {
|
||||
extern declare, blkhed, blkend;
|
||||
extern printf, statement, peeksym, cval, symbol, retseq;
|
||||
extern paraml;
|
||||
auto o;
|
||||
|
||||
printf(".text; 1:mov r5,-(sp); mov sp,r5\n");
|
||||
declare(8);
|
||||
declist();
|
||||
statement(1);
|
||||
retseq();
|
||||
}
|
||||
|
||||
extdef() {
|
||||
extern eof, function, cval;
|
||||
extern symbol, block, printf, pname, errflush, csym[];
|
||||
extern error;
|
||||
auto o, c, cs[];
|
||||
char s[];
|
||||
|
||||
if(((o=symbol())==0) | o==1) /* EOF */
|
||||
return;
|
||||
if(o!=20)
|
||||
goto syntax;
|
||||
csym[0] = 6;
|
||||
cs = &csym[4];
|
||||
printf(".globl %p\n", cs);
|
||||
s = ".data; %p:1f\n";
|
||||
switch(o=symbol()) {
|
||||
|
||||
case 6: /* ( */
|
||||
printf(s, cs);
|
||||
function();
|
||||
return;
|
||||
|
||||
case 21: /* const */
|
||||
printf(".data; %p: %o\n", cs, cval);
|
||||
if((o=symbol())!=1) /* ; */
|
||||
goto syntax;
|
||||
return;
|
||||
|
||||
case 1: /* ; */
|
||||
printf(".bss; %p: .=.+2\n", cs);
|
||||
return;
|
||||
|
||||
case 4: /* [ */
|
||||
c = 0;
|
||||
if((o=symbol())==21) { /* const */
|
||||
c = cval<<1;
|
||||
o = symbol();
|
||||
}
|
||||
if(o!=5) /* ] */
|
||||
goto syntax;
|
||||
printf(s, cs);
|
||||
if((o=symbol())==1) { /* ; */
|
||||
printf(".bss; 1:.=.+%o\n", c);
|
||||
return;
|
||||
}
|
||||
printf("1:");
|
||||
while(o==21) { /* const */
|
||||
printf("%o\n", cval);
|
||||
c =- 2;
|
||||
if((o=symbol())==1) /* ; */
|
||||
goto done;
|
||||
if(o!=9) /* , */
|
||||
goto syntax;
|
||||
else
|
||||
o = symbol();
|
||||
}
|
||||
goto syntax;
|
||||
done:
|
||||
if(c>0)
|
||||
printf(".=.+%o\n", c);
|
||||
return;
|
||||
|
||||
case 0: /* EOF */
|
||||
return;
|
||||
}
|
||||
|
||||
syntax:
|
||||
error("External definition syntax");
|
||||
errflush(o);
|
||||
statement(0);
|
||||
}
|
||||
|
||||
statement(d) {
|
||||
extern symbol, error, blkhed, eof, peeksym;
|
||||
extern blkend, csym[], rcexpr, block[], tree[], regtab[];
|
||||
extern retseq, jumpc, jump, label, contlab, brklab, cval;
|
||||
extern swp[], isn, pswitch, peekc, slabel;
|
||||
extern efftab[], declare, deflab, errflush, swtab[], swsiz, branch;
|
||||
|
||||
int o, o1, o2, o3, np[];
|
||||
|
||||
stmt:
|
||||
switch(o=symbol()) {
|
||||
|
||||
/* EOF */
|
||||
case 0:
|
||||
error("Unexpected EOF");
|
||||
/* ; */
|
||||
case 1:
|
||||
/* } */
|
||||
case 3:
|
||||
return;
|
||||
|
||||
/* { */
|
||||
case 2: {
|
||||
if(d)
|
||||
blkhed();
|
||||
while (!eof) {
|
||||
if ((o=symbol())==3) /* } */
|
||||
goto bend;
|
||||
peeksym = o;
|
||||
statement(0);
|
||||
}
|
||||
error("Missing '}'");
|
||||
bend:
|
||||
return;
|
||||
}
|
||||
|
||||
/* keyword */
|
||||
case 19:
|
||||
switch(cval) {
|
||||
|
||||
/* goto */
|
||||
case 10:
|
||||
o1 = block(1,102,0,0,tree());
|
||||
rcexpr(o1, regtab);
|
||||
goto semi;
|
||||
|
||||
/* return */
|
||||
case 11:
|
||||
if((peeksym=symbol())==6) /* ( */
|
||||
rcexpr(pexpr(), regtab);
|
||||
retseq();
|
||||
goto semi;
|
||||
|
||||
/* if */
|
||||
case 12:
|
||||
jumpc(pexpr(), o1=isn++, 0);
|
||||
statement(0);
|
||||
if ((o=symbol())==19 & cval==14) { /* else */
|
||||
o2 = isn++;
|
||||
(easystmt()?branch:jump)(o2);
|
||||
label(o1);
|
||||
statement(0);
|
||||
label(o2);
|
||||
return;
|
||||
}
|
||||
peeksym = o;
|
||||
label(o1);
|
||||
return;
|
||||
|
||||
/* while */
|
||||
case 13:
|
||||
o1 = contlab;
|
||||
o2 = brklab;
|
||||
label(contlab = isn++);
|
||||
jumpc(pexpr(), brklab=isn++, 0);
|
||||
o3 = easystmt();
|
||||
statement(0);
|
||||
(o3?branch:jump)(contlab);
|
||||
label(brklab);
|
||||
contlab = o1;
|
||||
brklab = o2;
|
||||
return;
|
||||
|
||||
/* break */
|
||||
case 17:
|
||||
if(brklab==0)
|
||||
error("Nothing to break from");
|
||||
jump(brklab);
|
||||
goto semi;
|
||||
|
||||
/* continue */
|
||||
case 18:
|
||||
if(contlab==0)
|
||||
error("Nothing to continue");
|
||||
jump(contlab);
|
||||
goto semi;
|
||||
|
||||
/* do */
|
||||
case 19:
|
||||
o1 = contlab;
|
||||
o2 = brklab;
|
||||
contlab = isn++;
|
||||
brklab = isn++;
|
||||
label(o3 = isn++);
|
||||
statement(0);
|
||||
label(contlab);
|
||||
contlab = o1;
|
||||
if ((o=symbol())==19 & cval==13) { /* while */
|
||||
jumpc(tree(), o3, 1);
|
||||
label(brklab);
|
||||
brklab = o2;
|
||||
goto semi;
|
||||
}
|
||||
goto syntax;
|
||||
|
||||
/* case */
|
||||
case 16:
|
||||
if ((o=symbol())!=21) /* constant */
|
||||
goto syntax;
|
||||
if ((o=symbol())!=8) /* : */
|
||||
goto syntax;
|
||||
if (swp==0) {
|
||||
error("Case not in switch");
|
||||
goto stmt;
|
||||
}
|
||||
if(swp>=swtab+swsiz) {
|
||||
error("Switch table overflow");
|
||||
} else {
|
||||
*swp++ = isn;
|
||||
*swp++ = cval;
|
||||
label(isn++);
|
||||
}
|
||||
goto stmt;
|
||||
|
||||
/* switch */
|
||||
case 15:
|
||||
o1 = brklab;
|
||||
brklab = isn++;
|
||||
np = pexpr();
|
||||
if (np[1]>1 & np[1]<16)
|
||||
error("Integer required");
|
||||
rcexpr(np, regtab);
|
||||
pswitch();
|
||||
brklab = o1;
|
||||
return;
|
||||
|
||||
/* default */
|
||||
case 20:
|
||||
if (swp==0)
|
||||
error("Default not in switch");
|
||||
if ((o=symbol())!=8) /* : */
|
||||
goto syntax;
|
||||
deflab = isn++;
|
||||
label(deflab);
|
||||
goto stmt;
|
||||
}
|
||||
|
||||
error("Unknown keyword");
|
||||
goto syntax;
|
||||
|
||||
/* name */
|
||||
case 20:
|
||||
if (peekc==':') {
|
||||
peekc = 0;
|
||||
if (csym[0]>0) {
|
||||
error("Redefinition");
|
||||
goto stmt;
|
||||
}
|
||||
csym[0] = 2;
|
||||
csym[1] = 020; /* int[] */
|
||||
if (csym[2]==0)
|
||||
csym[2] = isn++;
|
||||
slabel();
|
||||
goto stmt;
|
||||
}
|
||||
}
|
||||
|
||||
peeksym = o;
|
||||
rcexpr(tree(), efftab);
|
||||
goto semi;
|
||||
|
||||
semi:
|
||||
if ((o=symbol())!=1) /* ; */
|
||||
goto syntax;
|
||||
return;
|
||||
|
||||
syntax:
|
||||
error("Statement syntax");
|
||||
errflush(o);
|
||||
goto stmt;
|
||||
}
|
||||
|
||||
pexpr()
|
||||
{
|
||||
auto o, t;
|
||||
|
||||
if ((o=symbol())!=6) /* ( */
|
||||
goto syntax;
|
||||
t = tree();
|
||||
if ((o=symbol())!=7) /* ) */
|
||||
goto syntax;
|
||||
return(t);
|
||||
syntax:
|
||||
error("Statement syntax");
|
||||
errflush(o);
|
||||
return(0);
|
||||
}
|
||||
|
||||
pswitch() {
|
||||
extern swp[], isn, swtab[], printf, deflab, statement, brklab;
|
||||
extern label;
|
||||
int sswp[], dl, cv, swlab;
|
||||
|
||||
sswp = swp;
|
||||
if (swp==0)
|
||||
swp = swtab;
|
||||
swlab = isn++;
|
||||
printf("jsr pc,bswitch; l%d\n", swlab);
|
||||
dl = deflab;
|
||||
deflab = 0;
|
||||
statement(0);
|
||||
if (!deflab) {
|
||||
deflab = isn++;
|
||||
label(deflab);
|
||||
}
|
||||
printf("L%d:.data;L%d:", brklab, swlab);
|
||||
while(swp>sswp & swp>swtab) {
|
||||
cv = *--swp;
|
||||
printf("%o; l%d\n", cv, *--swp);
|
||||
}
|
||||
printf("L%d; 0\n.text\n", deflab);
|
||||
deflab = dl;
|
||||
swp = sswp;
|
||||
}
|
||||
|
||||
blkhed()
|
||||
{
|
||||
extern symbol, cval, declare, peeksym, paraml[], parame[];
|
||||
extern error, length, rlength, setstk, defvec, isn, defstat;
|
||||
extern stack, hshtab[], hshsiz, pssiz;
|
||||
int o, al, pl, cs[], hl;
|
||||
|
||||
declist();
|
||||
stack = al = -2;
|
||||
pl = 4;
|
||||
while(paraml) {
|
||||
*parame = 0;
|
||||
paraml = *(cs = paraml);
|
||||
cs[2] = pl;
|
||||
*cs = 10;
|
||||
pl =+ rlength(cs[1]);
|
||||
}
|
||||
cs = hshtab;
|
||||
hl = hshsiz;
|
||||
while(hl--) {
|
||||
if (cs[4])
|
||||
switch(cs[0]) {
|
||||
|
||||
/* sort unmentioned */
|
||||
case 0177776: /* -2 */
|
||||
cs[0] = 5; /* auto */
|
||||
|
||||
/* auto */
|
||||
case 5:
|
||||
if (cs[3]) { /* vector */
|
||||
al =- (cs[3]*length(cs[1]-020)+1) & 077776;
|
||||
setstk(al);
|
||||
defvec(al);
|
||||
}
|
||||
cs[2] = al;
|
||||
al =- rlength(cs[1]);
|
||||
goto loop;
|
||||
|
||||
/* parameter */
|
||||
case 10:
|
||||
cs[0] = 5;
|
||||
goto loop;
|
||||
|
||||
/* static */
|
||||
case 7:
|
||||
cs[2] = isn++;
|
||||
defstat(cs);
|
||||
goto loop;
|
||||
|
||||
loop:;
|
||||
}
|
||||
cs = cs+pssiz;
|
||||
}
|
||||
setstk(al);
|
||||
}
|
||||
|
||||
blkend() {
|
||||
extern hshtab[], hshsiz, pssiz, hshused;
|
||||
auto i, hl;
|
||||
|
||||
i = 0;
|
||||
hl = hshsiz;
|
||||
while(hl--) {
|
||||
if(hshtab[i+4])
|
||||
if (hshtab[i]==0)
|
||||
error("%p undefined", &hshtab[i+4]);
|
||||
if(hshtab[i]!=1) { /* not keyword */
|
||||
hshused--;
|
||||
hshtab[i+4] = 0;
|
||||
}
|
||||
i =+ pssiz;
|
||||
}
|
||||
}
|
||||
|
||||
errflush(o) {
|
||||
extern symbol, peeksym, eof;
|
||||
|
||||
while(o>3) /* ; { } */
|
||||
o = symbol();
|
||||
peeksym = o;
|
||||
}
|
||||
|
||||
declist()
|
||||
{
|
||||
extern peeksym, peekc, csym[], cval;
|
||||
auto o;
|
||||
|
||||
while((o=symbol())==19 & cval<10)
|
||||
declare(cval);
|
||||
peeksym = o;
|
||||
}
|
||||
|
||||
easystmt()
|
||||
{
|
||||
extern peeksym, peekc, cval;
|
||||
|
||||
if((peeksym=symbol())==20) /* name */
|
||||
return(peekc!=':'); /* not label */
|
||||
if (peeksym==19) { /* keyword */
|
||||
switch(cval)
|
||||
|
||||
case 10: /* goto */
|
||||
case 11: /* return */
|
||||
case 17: /* break */
|
||||
case 18: /* continue */
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
return(peeksym!=2); /* { */
|
||||
}
|
||||
|
||||
branch(lab)
|
||||
{
|
||||
printf("br L%d\n", lab);
|
||||
}
|
||||
|
189
last1120c/c03.c
Normal file
189
last1120c/c03.c
Normal file
@ -0,0 +1,189 @@
|
||||
jumpc(tree, lbl, cond)
|
||||
int tree[];
|
||||
{
|
||||
extern cctab, block, rcexpr;
|
||||
|
||||
rcexpr(block(1,easystmt()+103,tree,lbl,cond),cctab);
|
||||
}
|
||||
|
||||
rcexpr(tree, table)
|
||||
int tree[], table;
|
||||
{
|
||||
extern space, ospace, putwrd, putchar, line;
|
||||
int c, sp[];
|
||||
|
||||
putchar('#');
|
||||
c = space-ospace;
|
||||
c =/ 2; /* # addresses per word */
|
||||
sp = ospace;
|
||||
|
||||
putwrd(c);
|
||||
putwrd(tree);
|
||||
putwrd(table);
|
||||
putwrd(line);
|
||||
while(c--)
|
||||
putwrd(*sp++);
|
||||
}
|
||||
|
||||
jump(lab) {
|
||||
extern printf;
|
||||
|
||||
printf("jmp\tl%d\n", lab);
|
||||
}
|
||||
|
||||
label(l) {
|
||||
extern printf;
|
||||
|
||||
printf("l%d:", l);
|
||||
}
|
||||
|
||||
retseq() {
|
||||
extern printf;
|
||||
|
||||
printf("jmp\tretrn\n");
|
||||
}
|
||||
|
||||
slabel() {
|
||||
extern csym[], printf;
|
||||
|
||||
printf(".data; l%d: 1f; .text; 1:\n", csym[2]);
|
||||
}
|
||||
|
||||
setstk(a) {
|
||||
extern printf, stack;
|
||||
auto ts;
|
||||
|
||||
ts = a-stack;
|
||||
stack = a;
|
||||
switch(ts) {
|
||||
|
||||
case 0:
|
||||
return;
|
||||
|
||||
case 0177776: /* -2 */
|
||||
printf("tst -(sp)\n");
|
||||
return;
|
||||
|
||||
case 0177774: /* -4 */
|
||||
printf("cmp -(sp),-(sp)\n");
|
||||
return;
|
||||
}
|
||||
printf("add $%o,sp\n", ts);
|
||||
}
|
||||
|
||||
defvec() {
|
||||
extern printf, stack;
|
||||
|
||||
printf("mov\tsp,r0\nmov\tr0,-(sp)\n");
|
||||
stack =- 2;
|
||||
}
|
||||
|
||||
defstat(s)
|
||||
int s[]; {
|
||||
extern printf, length;
|
||||
int len;
|
||||
|
||||
len = length(s[1]);
|
||||
if (s[3])
|
||||
printf(".data; l%d:1f; .bss; 1:.=.+%o; .even; .text\n", s[2],
|
||||
s[3]*len);
|
||||
else
|
||||
printf(".bss; l%d:.=.+%o; .even; .text\n", s[2], len);
|
||||
}
|
||||
|
||||
length(t) {
|
||||
|
||||
if (t<0)
|
||||
t =+ 020;
|
||||
if (t>=020)
|
||||
return(2);
|
||||
switch(t) {
|
||||
|
||||
case 0:
|
||||
return(2);
|
||||
|
||||
case 1:
|
||||
return(1);
|
||||
|
||||
case 2:
|
||||
return(4);
|
||||
|
||||
case 3:
|
||||
return(8);
|
||||
|
||||
case 4:
|
||||
return(4);
|
||||
|
||||
}
|
||||
return(1024);
|
||||
}
|
||||
|
||||
rlength(c) {
|
||||
extern length;
|
||||
auto l;
|
||||
|
||||
return((l=length(c))==1? 2: l);
|
||||
}
|
||||
|
||||
printn(n,b) {
|
||||
extern putchar;
|
||||
auto a;
|
||||
|
||||
if(a=n/b) /* assignment, not test for equality */
|
||||
printn(a, b); /* recursive */
|
||||
putchar(n%b + '0');
|
||||
}
|
||||
|
||||
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
|
||||
char fmt[]; {
|
||||
extern printn, putchar, namsiz, ncpw;
|
||||
char s[];
|
||||
auto adx[], x, c, i[];
|
||||
|
||||
adx = &x1; /* argument pointer */
|
||||
loop:
|
||||
while((c = *fmt++) != '%') {
|
||||
if(c == '\0')
|
||||
return;
|
||||
putchar(c);
|
||||
}
|
||||
x = *adx++;
|
||||
switch (c = *fmt++) {
|
||||
|
||||
case 'd': /* decimal */
|
||||
case 'o': /* octal */
|
||||
if(x < 0) {
|
||||
x = -x;
|
||||
if(x<0) { /* - infinity */
|
||||
if(c=='o')
|
||||
printf("100000");
|
||||
else
|
||||
printf("-32767");
|
||||
goto loop;
|
||||
}
|
||||
putchar('-');
|
||||
}
|
||||
printn(x, c=='o'?8:10);
|
||||
goto loop;
|
||||
|
||||
case 's': /* string */
|
||||
s = x;
|
||||
while(c = *s++)
|
||||
putchar(c);
|
||||
goto loop;
|
||||
|
||||
case 'p':
|
||||
s = x;
|
||||
putchar('_');
|
||||
c = namsiz;
|
||||
while(c--)
|
||||
if(*s)
|
||||
putchar(*s++);
|
||||
goto loop;
|
||||
}
|
||||
putchar('%');
|
||||
fmt--;
|
||||
adx--;
|
||||
goto loop;
|
||||
}
|
||||
|
264
last1120c/c0t.s
Normal file
264
last1120c/c0t.s
Normal file
@ -0,0 +1,264 @@
|
||||
/ word I/O
|
||||
|
||||
.globl _putwrd
|
||||
|
||||
.globl _tmpfil
|
||||
.globl putw
|
||||
.globl fcreat
|
||||
.globl flush
|
||||
|
||||
.data
|
||||
_putwrd: 1f
|
||||
.text
|
||||
1:
|
||||
tst buf
|
||||
bne 1f
|
||||
mov _tmpfil,r0
|
||||
jsr r5,fcreat; buf
|
||||
bec 1f
|
||||
mov $1,r0
|
||||
sys write; botch; ebotch-botch
|
||||
sys exit
|
||||
1:
|
||||
mov 2(sp),r0
|
||||
jsr r5,putw; buf
|
||||
rts pc
|
||||
.globl _flshw
|
||||
.data
|
||||
_flshw: 1f
|
||||
.text
|
||||
1:
|
||||
jsr r5,flush; buf
|
||||
rts pc
|
||||
|
||||
botch: <Temp file?\n\0>; ebotch:
|
||||
.even
|
||||
|
||||
.bss
|
||||
buf: .=.+518.
|
||||
.text
|
||||
|
||||
/ C operator and conversion tables
|
||||
|
||||
.globl _opdope
|
||||
.globl _cvtab
|
||||
|
||||
_opdope:.+2
|
||||
00000 / EOF
|
||||
00000 / ;
|
||||
00000 / {
|
||||
00000 / }
|
||||
36000 / [
|
||||
02000 / ]
|
||||
36000 / (
|
||||
02000 / )
|
||||
14201 / :
|
||||
07001 / ,
|
||||
00000 / 10
|
||||
00000 / 11
|
||||
00000 / 12
|
||||
00000 / 13
|
||||
00000 / 14
|
||||
00000 / 15
|
||||
00000 / 16
|
||||
00000 / 17
|
||||
00000 / 18
|
||||
00000 / 19
|
||||
00000 / name
|
||||
00000 / short constant
|
||||
00000 / string
|
||||
00000 / float
|
||||
00000 / double
|
||||
00000 / 25
|
||||
00000 / 26
|
||||
00000 / 27
|
||||
00000 / 28
|
||||
00000 / 29
|
||||
34202 / ++pre
|
||||
34202 / --pre
|
||||
34202 / ++post
|
||||
34202 / --post
|
||||
34220 / !un
|
||||
34202 / &un
|
||||
34220 / *un
|
||||
34200 / -un
|
||||
34220 / ~un
|
||||
00000 / 39
|
||||
30101 / +
|
||||
30001 / -
|
||||
32101 / *
|
||||
32001 / /
|
||||
32001 / %
|
||||
26061 / >>
|
||||
26061 / <<
|
||||
20161 / &
|
||||
16161 / |
|
||||
16161 / ^
|
||||
00000 / 50
|
||||
00000 / 51
|
||||
00000 / 52
|
||||
00000 / 53
|
||||
00000 / 54
|
||||
00000 / 55
|
||||
00000 / 56
|
||||
00000 / 57
|
||||
00000 / 58
|
||||
00000 / 59
|
||||
22105 / ==
|
||||
22105 / !=
|
||||
24105 / <=
|
||||
24105 / <
|
||||
24105 / >=
|
||||
24105 / >
|
||||
24105 / <p
|
||||
24105 / <=p
|
||||
24105 / >p
|
||||
24105 / >=p
|
||||
12213 / =+
|
||||
12213 / =-
|
||||
12213 / =*
|
||||
12213 / =/
|
||||
12213 / =%
|
||||
12253 / =>>
|
||||
12253 / =<<
|
||||
12253 / =&
|
||||
12253 / =|
|
||||
12253 / =^
|
||||
12213 / =
|
||||
00000 / 81
|
||||
00000 / 82
|
||||
00000 / 83
|
||||
00000 / int -> float
|
||||
00000 / int -> double
|
||||
00000 / float -> int
|
||||
00000 / float -> double
|
||||
00000 / double -> int
|
||||
00000 / double -> float
|
||||
14201 / ?
|
||||
00000 / 91
|
||||
00000 / 92
|
||||
00000 / 93
|
||||
00000 / int -> float
|
||||
00000 / int -> double
|
||||
00000 / float -> double
|
||||
00000 / int -> int[]
|
||||
00000 / int -> float[]
|
||||
00000 / int -> double[]
|
||||
36001 / call
|
||||
36001 / mcall
|
||||
|
||||
_cvtab: .+2
|
||||
.byte 000 / i:i
|
||||
.byte 000 / i:c
|
||||
.byte 113 / i:f
|
||||
.byte 125 / i:d
|
||||
.byte 140 / i:i[]
|
||||
.byte 100 / i:c[]
|
||||
.byte 150 / i:f[]
|
||||
.byte 160 / i:d[]
|
||||
.byte 140 / i:[][]
|
||||
|
||||
.byte 100 / c:i
|
||||
.byte 100 / c:c
|
||||
.byte 113 / c:f
|
||||
.byte 125 / c:d
|
||||
.byte 140 / c:i[]
|
||||
.byte 100 / c:c[]
|
||||
.byte 150 / c:f[]
|
||||
.byte 160 / c:d[]
|
||||
.byte 140 / c[][]
|
||||
|
||||
.byte 211 / f:i
|
||||
.byte 211 / f:c
|
||||
.byte 000 / f:f
|
||||
.byte 136 / f:d
|
||||
.byte 211 / f:i[]
|
||||
.byte 211 / f:c[]
|
||||
.byte 211 / f:f[]
|
||||
.byte 211 / f:d[]
|
||||
.byte 211 / f:[][]
|
||||
|
||||
.byte 222 / d:i
|
||||
.byte 222 / d:c
|
||||
.byte 234 / d:f
|
||||
.byte 000 / d:d
|
||||
.byte 222 / d:i[]
|
||||
.byte 222 / d:c[]
|
||||
.byte 222 / d:f[]
|
||||
.byte 222 / d:d[]
|
||||
.byte 222 / d:[][]
|
||||
|
||||
.byte 240 / i[]:i
|
||||
.byte 240 / i[]:c
|
||||
.byte 113 / i[]:f
|
||||
.byte 125 / i[]:d
|
||||
.byte 000 / i[]:i[]
|
||||
.byte 000 / i[]:c[]
|
||||
.byte 100 / i[]:f[]
|
||||
.byte 100 / i[]:d[]
|
||||
.byte 100 / i[]:[][]
|
||||
|
||||
.byte 000 / c[]:i
|
||||
.byte 000 / c[]:c
|
||||
.byte 113 / c[]:f
|
||||
.byte 125 / c[]:d
|
||||
.byte 200 / c[]:i[]
|
||||
.byte 000 / c[]:c[]
|
||||
.byte 200 / c[]:f[]
|
||||
.byte 200 / c[]:d[]
|
||||
.byte 200 / c[]:[][]
|
||||
|
||||
.byte 250 / f[]:i
|
||||
.byte 250 / f[]:c
|
||||
.byte 113 / f[]:f
|
||||
.byte 125 / f[]:d
|
||||
.byte 000 / f[]:i[]
|
||||
.byte 000 / f[]:c[]
|
||||
.byte 000 / f[]:f[]
|
||||
.byte 100 / f[]:d[]
|
||||
.byte 000 / f[]:[][]
|
||||
|
||||
.byte 260 / d[]:i
|
||||
.byte 260 / d[]:c
|
||||
.byte 113 / d[]:f
|
||||
.byte 125 / d[]:d
|
||||
.byte 000 / d[]:i[]
|
||||
.byte 000 / d[]:c[]
|
||||
.byte 000 / d[]:f[]
|
||||
.byte 000 / d[]:d[]
|
||||
.byte 000 / d[]:[][]
|
||||
|
||||
.byte 240 / [][]:i
|
||||
.byte 240 / [][]:c
|
||||
.byte 113 / [][]:f
|
||||
.byte 125 / [][]:d
|
||||
.byte 000 / [][]:i[]
|
||||
.byte 000 / [][]:c[]
|
||||
.byte 100 / [][]:f[]
|
||||
.byte 100 / [][]:d[]
|
||||
.byte 000 / [][]:[][]
|
||||
|
||||
.even
|
||||
|
||||
/ character type table
|
||||
|
||||
.globl _ctab
|
||||
|
||||
_ctab: .+2
|
||||
.byte 000.,127.,127.,127.,127.,127.,127.,127.
|
||||
.byte 127.,126.,125.,127.,127.,127.,127.,127.
|
||||
.byte 127.,127.,127.,127.,127.,127.,127.,127.
|
||||
.byte 127.,127.,127.,127.,127.,127.,127.,127.
|
||||
.byte 126.,034.,122.,127.,127.,044.,047.,121.
|
||||
.byte 006.,007.,042.,040.,009.,041.,127.,043.
|
||||
.byte 124.,124.,124.,124.,124.,124.,124.,124.
|
||||
.byte 124.,124.,008.,001.,063.,080.,065.,090.
|
||||
.byte 127.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,004.,127.,005.,049.,127.
|
||||
.byte 127.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,123.,123.,123.,123.,123.
|
||||
.byte 123.,123.,123.,002.,048.,003.,127.,127.
|
||||
|
469
last1120c/c10.c
Normal file
469
last1120c/c10.c
Normal file
@ -0,0 +1,469 @@
|
||||
/*
|
||||
|
||||
C compiler, part 2
|
||||
|
||||
Copyright 1972 Bell Telephone Laboratories, Inc.
|
||||
|
||||
*/
|
||||
|
||||
ospace() {} /* fake */
|
||||
|
||||
waste() /* waste space */
|
||||
{
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
}
|
||||
main(argc, argv)
|
||||
char argv[][];
|
||||
{
|
||||
extern fout, fin, nerror, line;
|
||||
extern getwrd, rcexpr, ospace, tmpfil;
|
||||
extern cctab[], regtab[], efftab[], sptab[];
|
||||
int sp[], c, table[], tabtab[3][], tree;
|
||||
|
||||
if (argc<4) {
|
||||
error("Arg count");
|
||||
exit(1);
|
||||
}
|
||||
if((fin=open(argv[1],0))<0) {
|
||||
error("Cant't find %s", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if((fout=creat(argv[3],017))<0) {
|
||||
error("Can't create %s", argv[3]);
|
||||
exit(1);
|
||||
}
|
||||
tmpfil = argv[2];
|
||||
|
||||
tabtab[0] = regtab;
|
||||
tabtab[1] = efftab;
|
||||
tabtab[2] = cctab;
|
||||
tabtab[3] = sptab;
|
||||
while(c=getchar()) {
|
||||
if(c=='#') {
|
||||
sp = ospace;
|
||||
c = getwrd();
|
||||
tree = getwrd();
|
||||
table = tabtab[getwrd()];
|
||||
line = getwrd();
|
||||
while(c--)
|
||||
*sp++ = getwrd();
|
||||
rcexpr(tree, table, 0);
|
||||
} else
|
||||
putchar(c);
|
||||
}
|
||||
flush();
|
||||
exit(nerror!=0);
|
||||
}
|
||||
|
||||
match(tree, table, nreg)
|
||||
int tree[], table[]; {
|
||||
extern opdope[], dcalc, notcompat;
|
||||
int op, d1, d2, t1, t2, p1[], p2[];
|
||||
char mp[];
|
||||
|
||||
if (tree==0)
|
||||
return(0);
|
||||
op = *tree;
|
||||
if (op>=29) /* if not leaf */
|
||||
p1 = tree[3];
|
||||
else
|
||||
p1 = tree;
|
||||
t1 = p1[1];
|
||||
d1 = dcalc(p1, nreg);
|
||||
if ((opdope[op]&01)!=0) { /* binary? */
|
||||
p2 = tree[4];
|
||||
t2 = p2[1];
|
||||
d2 = dcalc(p2, nreg);
|
||||
}
|
||||
while(*table) {
|
||||
if (*table++ == op) goto foundop;
|
||||
table++;
|
||||
}
|
||||
return(0);
|
||||
foundop:
|
||||
table = *table;
|
||||
nxtry:
|
||||
mp = table;
|
||||
if (*mp == 0)
|
||||
return(0);
|
||||
if (d1 > (*mp&077) | (*mp>=0100)&(*p1!=36))
|
||||
goto notyet;
|
||||
if (notcompat(t1, mp[1]))
|
||||
goto notyet;
|
||||
if ((opdope[op]&01)!=0 & p2!=0) {
|
||||
if (d2 > (mp[2]&077) | (mp[2]>=0100)&(*p2!=36))
|
||||
goto notyet;
|
||||
if (notcompat(t2,mp[3]))
|
||||
goto notyet;
|
||||
}
|
||||
now:
|
||||
return(table[2]);
|
||||
notyet:
|
||||
table = table+3;
|
||||
goto nxtry;
|
||||
}
|
||||
|
||||
rcexpr(tree, table, reg)
|
||||
int tree[]; {
|
||||
extern cexpr, regtab, cctab, sptab, printf, error;
|
||||
extern jumpc, cbranch;
|
||||
|
||||
if(tree==0)
|
||||
return;
|
||||
if(*tree >= 103) {
|
||||
(*tree==103?jumpc:cbranch)(tree[1],tree[2],tree[3],0);
|
||||
return;
|
||||
}
|
||||
if (cexpr(tree, table, reg))
|
||||
return;
|
||||
if (table!=regtab)
|
||||
if(cexpr(tree, regtab, reg)) {
|
||||
if (table==sptab)
|
||||
printf("mov r%d,-(sp)\n", reg);
|
||||
if (table==cctab)
|
||||
printf("tst r%d\n", reg);
|
||||
return;
|
||||
}
|
||||
error("No match for op %d", *tree);
|
||||
}
|
||||
|
||||
cexpr(tree, table, reg)
|
||||
int tree[][], table[]; {
|
||||
extern match, nreg, printf, pname, putchar, regtab;
|
||||
extern sptab, cctab, rcexpr, prins, rlength, popstk;
|
||||
extern collcon, isn, label, branch, cbranch, fltmod;
|
||||
int p1[], p2[], c, r, p[], otable[], ctable[], regtab[], cctab[];
|
||||
char string[], match[];
|
||||
|
||||
if ((c = *tree)==100) { /* call */
|
||||
p1 = tree[3];
|
||||
p2 = tree[4];
|
||||
r = 0;
|
||||
if(p2) {
|
||||
while (*p2==9) { /* comma */
|
||||
rcexpr(p2[4], sptab, 0);
|
||||
r =+ rlength((p=p2[4])[1]);
|
||||
p2 = p2[3];
|
||||
}
|
||||
rcexpr(p2, sptab, 0);
|
||||
r =+ rlength(p2[1]);
|
||||
}
|
||||
*tree = 101;
|
||||
tree[2] = r; /* save arg length */
|
||||
}
|
||||
if(c==90) { /* ? */
|
||||
cbranch(tree[3], c=isn++, 0, reg);
|
||||
rcexpr(tree[4][3], table, reg);
|
||||
branch(r=isn++, 0);
|
||||
label(c);
|
||||
rcexpr(tree[4][4], table, reg);
|
||||
label(r);
|
||||
return(1);
|
||||
}
|
||||
if ((string=match(tree, table, nreg-reg))==0)
|
||||
return(0);
|
||||
p1 = tree[3];
|
||||
p2 = tree[4];
|
||||
loop:
|
||||
switch(c = *string++) {
|
||||
|
||||
case '\0':
|
||||
p = tree;
|
||||
if (*p==101 & p[2]>0) {
|
||||
popstk(p[2]);
|
||||
}
|
||||
return(1);
|
||||
|
||||
/* A1 */
|
||||
case 'A':
|
||||
p = tree[3];
|
||||
goto adr;
|
||||
|
||||
/* A2 */
|
||||
case 'B':
|
||||
p = tree[4];
|
||||
goto adr;
|
||||
|
||||
/* A */
|
||||
case 'O':
|
||||
p = tree;
|
||||
adr:
|
||||
pname(p);
|
||||
goto loop;
|
||||
|
||||
/* I */
|
||||
case 'M':
|
||||
if ((c = *string)=='\'')
|
||||
string++; else
|
||||
c = 0;
|
||||
prins(*tree, c);
|
||||
goto loop;
|
||||
|
||||
/* B1 */
|
||||
case 'C':
|
||||
p = tree[3];
|
||||
goto pbyte;
|
||||
|
||||
/* BF */
|
||||
case 'P':
|
||||
p = tree;
|
||||
goto pb1;
|
||||
|
||||
/* B2 */
|
||||
case 'D':
|
||||
p = tree[4];
|
||||
pbyte:
|
||||
if (p[1]==1) /* char type? */
|
||||
putchar('b');
|
||||
pb1:
|
||||
if (isfloat(p))
|
||||
putchar('f');
|
||||
goto loop;
|
||||
|
||||
/* BE */
|
||||
case 'L':
|
||||
if (tree[3][1]==1 | tree[4][1]==1)
|
||||
putchar('b');
|
||||
goto loop;
|
||||
|
||||
/* C1 */
|
||||
case 'E':
|
||||
p = p1[3];
|
||||
goto const;
|
||||
|
||||
/* C2 */
|
||||
case 'F':
|
||||
p = p2[3];
|
||||
const:
|
||||
printf("%o", p);
|
||||
goto loop;
|
||||
|
||||
/* F */
|
||||
case 'G':
|
||||
p = p1;
|
||||
goto subtre;
|
||||
|
||||
/* S */
|
||||
case 'K':
|
||||
p = p2;
|
||||
goto subtre;
|
||||
|
||||
/* H */
|
||||
case 'H':
|
||||
p = tree;
|
||||
|
||||
subtre:
|
||||
ctable = regtab;
|
||||
r = reg;
|
||||
c = *string++ - 'A';
|
||||
if ((c&02)!=0)
|
||||
ctable = sptab;
|
||||
if ((c&04)!=0)
|
||||
ctable = cctab;
|
||||
if((c&010)!=0)
|
||||
r = reg+1;
|
||||
if((c&01)!=0)
|
||||
if(*p==36) {
|
||||
p = p[3];
|
||||
if(collcon(p) & ctable!=sptab)
|
||||
p = p[3];
|
||||
}
|
||||
rcexpr(p, ctable, r);
|
||||
goto loop;
|
||||
|
||||
/* R */
|
||||
case 'I':
|
||||
r = reg;
|
||||
goto preg;
|
||||
|
||||
/* R1 */
|
||||
case 'J':
|
||||
r = reg+1;
|
||||
preg:
|
||||
printf("r%d", r);
|
||||
goto loop;
|
||||
|
||||
case '#':
|
||||
p = p1[3];
|
||||
goto nmbr;
|
||||
|
||||
case '"':
|
||||
p = p2[3];
|
||||
goto nmbr;
|
||||
case '~':
|
||||
p = tree[3];
|
||||
|
||||
nmbr:
|
||||
if(collcon(p)) {
|
||||
c = *p;
|
||||
if(r = (p=p[4])[3])
|
||||
printf("%o", c==40?r:-r);
|
||||
}
|
||||
goto loop;
|
||||
|
||||
/* M */
|
||||
case 'N':
|
||||
if ((c=isfloat(tree, &string))==fltmod)
|
||||
goto loop;
|
||||
printf((fltmod=c)==2?"setf\n":"setd\n");
|
||||
goto loop;
|
||||
|
||||
/* Z */
|
||||
case 'Z':
|
||||
printf("$%o", p1[4]);
|
||||
goto loop;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
pname(p)
|
||||
int p[][][]; {
|
||||
extern putchar, printf, error;
|
||||
char np[];
|
||||
int i;
|
||||
|
||||
loop:
|
||||
switch(*p) {
|
||||
|
||||
case 21: /* const */
|
||||
printf("$%o", p[3]);
|
||||
return;
|
||||
|
||||
case 22: /* string */
|
||||
printf("$l%d", p[3]);
|
||||
return;
|
||||
|
||||
case 20: /* name */
|
||||
switch(p[3]) {
|
||||
|
||||
case 5: /* auto, param */
|
||||
printf("%o(r5)", p[4]);
|
||||
return;
|
||||
|
||||
/* extern */
|
||||
case 6:
|
||||
printf("%p", &p[4]);
|
||||
return;
|
||||
|
||||
}
|
||||
printf("L%d", p[4]);
|
||||
return;
|
||||
|
||||
case 35: /* & */
|
||||
putchar('$');
|
||||
p = p[3];
|
||||
goto loop;
|
||||
|
||||
case 36: /* * */
|
||||
putchar('*');
|
||||
p = p[3];
|
||||
goto loop;
|
||||
}
|
||||
error("pname called illegally");
|
||||
}
|
||||
|
||||
dcalc(p, nreg)
|
||||
int p[]; {
|
||||
int op, t;
|
||||
|
||||
if (p==0)
|
||||
return(0);
|
||||
op = *p;
|
||||
switch (op) {
|
||||
|
||||
case 20: /* name */
|
||||
case 22: /* string */
|
||||
case 23: /* float */
|
||||
case 24: /* double */
|
||||
return(12);
|
||||
|
||||
case 21: /* short constant */
|
||||
return(p[3]==0? 4:8);
|
||||
|
||||
case 35: /* & */
|
||||
return(12);
|
||||
|
||||
case 36: /* * */
|
||||
if ((op=dcalc(p[3], nreg))<16)
|
||||
return(16);
|
||||
}
|
||||
|
||||
def:
|
||||
return(p[2]<=nreg? 20: 24);
|
||||
}
|
||||
|
||||
notcompat(at, st) {
|
||||
|
||||
if (st==0) /* word, byte */
|
||||
return(at>1 & at<16);
|
||||
if (st==1) /* word */
|
||||
return(at>0 & at<16);
|
||||
st =- 2;
|
||||
if (st==2 & at==3)
|
||||
at = 2;
|
||||
return(st != at);
|
||||
}
|
||||
|
||||
prins(op, c) {
|
||||
extern instab[], printf;
|
||||
int insp[];
|
||||
|
||||
insp = instab;
|
||||
while(*insp) {
|
||||
if (*insp++ == op) {
|
||||
if ((c = insp[c!=0])==0)
|
||||
goto err;
|
||||
printf("%s", c);
|
||||
return;
|
||||
} else
|
||||
insp = insp + 2;
|
||||
}
|
||||
err:
|
||||
error("No match' for op %d", op);
|
||||
}
|
||||
|
||||
collcon(p)
|
||||
int p[]; {
|
||||
int p1[];
|
||||
|
||||
if(*p==40 | *p==41)
|
||||
if(*(p1=p[4])==21)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
isfloat(t, s)
|
||||
int t[];
|
||||
char s[][];
|
||||
{
|
||||
extern opdope[];
|
||||
int rt;
|
||||
|
||||
rt = **s - '0';
|
||||
if (rt==2 | rt==4) {
|
||||
(*s)++;
|
||||
return(rt>2?3:2);
|
||||
}
|
||||
if ((opdope[t[0]]&010)!=0) /* relational */
|
||||
t = t[3];
|
||||
if ((rt=t[1])>=2 & rt<=3)
|
||||
return(rt);
|
||||
return(0);
|
||||
}
|
||||
|
||||
nreg 4;
|
||||
isn 10000;
|
||||
namsiz 8;
|
||||
line;
|
||||
tmpfil;
|
||||
nerror;
|
||||
fltmod;
|
||||
|
251
last1120c/c11.c
Normal file
251
last1120c/c11.c
Normal file
@ -0,0 +1,251 @@
|
||||
jumpc(tree, lbl, cond)
|
||||
int tree[]; {
|
||||
extern jump, cctab[], rcexpr, isn, label, branch, cbranch;
|
||||
int l1, l2;
|
||||
|
||||
if (tree==0)
|
||||
return;
|
||||
switch(*tree) {
|
||||
|
||||
/* & */
|
||||
case 47:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 0, 0);
|
||||
cbranch(tree[4], l1, 0, 0);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 0, 0);
|
||||
cbranch(tree[4], l2=isn++, 1, 0);
|
||||
label(l1);
|
||||
jump(lbl);
|
||||
label(l2);
|
||||
}
|
||||
return;
|
||||
|
||||
/* | */
|
||||
case 48:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 1, 0);
|
||||
cbranch(tree[4], l2=isn++, 0, 0);
|
||||
label(l1);
|
||||
jump(lbl);
|
||||
label(l2);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 1, 0);
|
||||
cbranch(tree[4], l1, 1, 0);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
}
|
||||
return;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
jumpc(tree[3], lbl, !cond);
|
||||
return;
|
||||
}
|
||||
rcexpr(tree, cctab, 0);
|
||||
branch(l1=isn++, *tree, cond);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
return;
|
||||
}
|
||||
|
||||
cbranch(tree, lbl, cond, reg)
|
||||
int tree[]; {
|
||||
extern branch, cctab[], rcexpr, isn, label;
|
||||
int l1;
|
||||
|
||||
if (tree==0)
|
||||
return;
|
||||
switch(*tree) {
|
||||
|
||||
/* & */
|
||||
case 47:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 0, reg);
|
||||
cbranch(tree[4], lbl, 1, reg);
|
||||
label(l1);
|
||||
} else {
|
||||
cbranch(tree[3], lbl, 0, reg);
|
||||
cbranch(tree[4], lbl, 0, reg);
|
||||
}
|
||||
return;
|
||||
|
||||
/* | */
|
||||
case 48:
|
||||
if (cond) {
|
||||
cbranch(tree[3], lbl, 1, reg);
|
||||
cbranch(tree[4], lbl, 1, reg);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 1, reg);
|
||||
cbranch(tree[4], lbl, 0, reg);
|
||||
label(l1);
|
||||
}
|
||||
return;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
cbranch(tree[3], lbl, !cond, reg);
|
||||
return;
|
||||
}
|
||||
rcexpr(tree, cctab, reg);
|
||||
branch(lbl, *tree, !cond);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
branch(lbl, op, c) {
|
||||
extern printf, prins, opdope[];
|
||||
|
||||
if(op) {
|
||||
if((opdope[op]&04)==0)
|
||||
op = 61;
|
||||
prins(op,c);
|
||||
} else
|
||||
printf("br");
|
||||
printf("\tl%d\n", lbl);
|
||||
}
|
||||
|
||||
jump(lab) {
|
||||
extern printf;
|
||||
|
||||
printf("jmp\tl%d\n", lab);
|
||||
}
|
||||
|
||||
label(l) {
|
||||
extern printf;
|
||||
|
||||
printf("l%d:", l);
|
||||
}
|
||||
|
||||
|
||||
popstk(a) {
|
||||
extern printf;
|
||||
|
||||
switch(a) {
|
||||
|
||||
case 0:
|
||||
return;
|
||||
|
||||
case 2:
|
||||
printf("tst (sp)+\n");
|
||||
return;
|
||||
|
||||
case 4:
|
||||
printf("cmp (sp)+,(sp)+\n");
|
||||
return;
|
||||
}
|
||||
printf("add $%o,sp\n", a);
|
||||
}
|
||||
|
||||
length(t) {
|
||||
|
||||
if (t<0)
|
||||
t =+ 020;
|
||||
if (t>=020)
|
||||
return(2);
|
||||
switch(t) {
|
||||
|
||||
case 0:
|
||||
return(2);
|
||||
|
||||
case 1:
|
||||
return(1);
|
||||
|
||||
case 2:
|
||||
return(4);
|
||||
|
||||
case 3:
|
||||
return(8);
|
||||
|
||||
case 4:
|
||||
return(4);
|
||||
|
||||
}
|
||||
return(1024);
|
||||
}
|
||||
|
||||
rlength(c) {
|
||||
extern length;
|
||||
auto l;
|
||||
|
||||
return((l=length(c))==1? 2: l);
|
||||
}
|
||||
|
||||
printn(n,b) {
|
||||
extern putchar;
|
||||
auto a;
|
||||
|
||||
if(a=n/b) /* assignment, not test for equality */
|
||||
printn(a, b); /* recursive */
|
||||
putchar(n%b + '0');
|
||||
}
|
||||
|
||||
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
|
||||
char fmt[]; {
|
||||
extern printn, putchar, namsiz, ncpw;
|
||||
char s[];
|
||||
auto adx[], x, c, i[];
|
||||
|
||||
adx = &x1; /* argument pointer */
|
||||
loop:
|
||||
while((c = *fmt++) != '%') {
|
||||
if(c == '\0')
|
||||
return;
|
||||
putchar(c);
|
||||
}
|
||||
x = *adx++;
|
||||
switch (c = *fmt++) {
|
||||
|
||||
case 'd': /* decimal */
|
||||
case 'o': /* octal */
|
||||
if(x < 0) {
|
||||
x = -x;
|
||||
if(x<0) { /* - infinity */
|
||||
if(c=='o')
|
||||
printf("100000");
|
||||
else
|
||||
printf("-32767");
|
||||
goto loop;
|
||||
}
|
||||
putchar('-');
|
||||
}
|
||||
printn(x, c=='o'?8:10);
|
||||
goto loop;
|
||||
|
||||
case 's': /* string */
|
||||
s = x;
|
||||
while(c = *s++)
|
||||
putchar(c);
|
||||
goto loop;
|
||||
|
||||
case 'p':
|
||||
s = x;
|
||||
putchar('_');
|
||||
c = namsiz;
|
||||
while(c--)
|
||||
if(*s)
|
||||
putchar(*s++);
|
||||
goto loop;
|
||||
}
|
||||
putchar('%');
|
||||
fmt--;
|
||||
adx--;
|
||||
goto loop;
|
||||
}
|
||||
|
||||
error(s, p1, p2) {
|
||||
extern printf, line, fout, flush, putchar, nerror;
|
||||
int f;
|
||||
|
||||
nerror++;
|
||||
flush();
|
||||
f = fout;
|
||||
fout = 1;
|
||||
printf("%d: ", line);
|
||||
printf(s, p1, p2);
|
||||
putchar('\n');
|
||||
fout = f;
|
||||
}
|
||||
|
171
last1120c/c1t.s
Normal file
171
last1120c/c1t.s
Normal file
@ -0,0 +1,171 @@
|
||||
/ C operator tables
|
||||
|
||||
.globl _getwrd
|
||||
|
||||
.globl getw
|
||||
.globl fopen
|
||||
.globl _tmpfil
|
||||
|
||||
.data
|
||||
_getwrd: 1f
|
||||
.text
|
||||
1:
|
||||
tst buf
|
||||
bne 1f
|
||||
mov _tmpfil,r0
|
||||
jsr r5,fopen; buf
|
||||
bes botchp
|
||||
1:
|
||||
jsr r5,getw; buf
|
||||
bes botchp
|
||||
rts pc
|
||||
botchp:
|
||||
mov $1,r0
|
||||
sys write; botch; ebotch-botch
|
||||
sys exit
|
||||
botch:
|
||||
<Temp file botch.\n>; ebotch:
|
||||
.even
|
||||
.bss
|
||||
buf: .=.+518.
|
||||
.text
|
||||
.globl _opdope
|
||||
.globl _instab
|
||||
|
||||
_instab:.+2
|
||||
40.; 1f; 1f; .data; 1:<add\0>; .text
|
||||
70.; 1b; 1b
|
||||
41.; 2f; 2f; .data; 2:<sub\0>; .text
|
||||
71.; 2b; 2b
|
||||
30.; 3f; 1b; .data; 3:<inc\0>; .text
|
||||
31.; 4f; 2b; .data; 4:<dec\0>; .text
|
||||
32.; 3b; 1b
|
||||
33.; 4b; 2b
|
||||
|
||||
45.; 2b; 5f; .data; 5:<ac\0>; .text
|
||||
46.; 6f; 7f; .data; 6:<mov\0>; 7:<(r4)\0>; .text
|
||||
75.; 2b; 5b
|
||||
76.; 6b; 7b
|
||||
43.; 7b; 1f; .data; 1:<divf\0>; .text
|
||||
44.; 5b; 0
|
||||
73.; 7b; 1b
|
||||
74.; 5b; 0
|
||||
|
||||
60.; 0f; 1f; .data; 0:<beq\0>; 1:<bne\0>; .text
|
||||
61.; 1b; 0b
|
||||
62.; 2f; 5f; .data; 2:<ble\0>; 5:<bgt\0>; .text
|
||||
63.; 3f; 4f; .data; 3:<blt\0>; 4:<bge\0>; .text
|
||||
64.; 4b; 3b
|
||||
65.; 5b; 2b
|
||||
66.; 6f; 9f; .data; 6:<blos\0>; 9:<bhi\0>; .text
|
||||
67.; 7f; 8f; .data; 7:<blo\0>; 8:<bhis\0>; .text
|
||||
68.; 8b; 7b
|
||||
69.; 9b; 6b
|
||||
0
|
||||
.data
|
||||
.even
|
||||
.text
|
||||
|
||||
_opdope:.+2
|
||||
00000 / EOF
|
||||
00000 / ;
|
||||
00000 / {
|
||||
00000 / }
|
||||
36000 / [
|
||||
02000 / ]
|
||||
36000 / (
|
||||
02000 / )
|
||||
02000 / :
|
||||
07001 / ,
|
||||
00000 / 10
|
||||
00000 / 11
|
||||
00000 / 12
|
||||
00000 / 13
|
||||
00000 / 14
|
||||
00000 / 15
|
||||
00000 / 16
|
||||
00000 / 17
|
||||
00000 / 18
|
||||
00000 / 19
|
||||
00000 / name
|
||||
00000 / short constant
|
||||
00000 / string
|
||||
00000 / float
|
||||
00000 / double
|
||||
00000 / 25
|
||||
00000 / 26
|
||||
00000 / 27
|
||||
00000 / 28
|
||||
00000 / 29
|
||||
34002 / ++pre
|
||||
34002 / --pre
|
||||
34002 / ++post
|
||||
34002 / --post
|
||||
34020 / !un
|
||||
34002 / &un
|
||||
34020 / *un
|
||||
34000 / -un
|
||||
34020 / ~un
|
||||
00000 / 39
|
||||
30101 / +
|
||||
30001 / -
|
||||
32101 / *
|
||||
32001 / /
|
||||
32001 / %
|
||||
26061 / >>
|
||||
26061 / <<
|
||||
20161 / &
|
||||
16161 / |
|
||||
16161 / ^
|
||||
00000 / 50
|
||||
00000 / 51
|
||||
00000 / 52
|
||||
00000 / 53
|
||||
00000 / 54
|
||||
00000 / 55
|
||||
00000 / 56
|
||||
00000 / 57
|
||||
00000 / 58
|
||||
00000 / 59
|
||||
22105 / ==
|
||||
22105 / !=
|
||||
24105 / <=
|
||||
24105 / <
|
||||
24105 / >=
|
||||
24105 / >
|
||||
24105 / <p
|
||||
24105 / <=p
|
||||
24105 / >p
|
||||
24105 / >=p
|
||||
12013 / =+
|
||||
12013 / =-
|
||||
12013 / =*
|
||||
12013 / =/
|
||||
12013 / =%
|
||||
12053 / =>>
|
||||
12053 / =<<
|
||||
12053 / =&
|
||||
12053 / =|
|
||||
12053 / =^
|
||||
12013 / =
|
||||
00000 / 81
|
||||
00000 / 82
|
||||
00000 / 83
|
||||
00000 / int -> float
|
||||
00000 / int -> double
|
||||
00000 / float -> int
|
||||
00000 / float -> double
|
||||
00000 / double -> int
|
||||
00000 / double -> float
|
||||
14001 / ?
|
||||
00000 / 91
|
||||
00000 / 92
|
||||
00000 / 93
|
||||
00000 / int -> float
|
||||
00000 / int -> double
|
||||
00000 / float -> double
|
||||
00000 / int -> int[]
|
||||
00000 / int -> float[]
|
||||
00000 / int -> double[]
|
||||
36001 / call
|
||||
36001 / mcall
|
118
last1120c/cctab.s
Normal file
118
last1120c/cctab.s
Normal file
@ -0,0 +1,118 @@
|
||||
/ c code tables-- set condition codes
|
||||
|
||||
.globl _cctab
|
||||
|
||||
_cctab=.;.+2
|
||||
20.; rest
|
||||
21.; rest
|
||||
22.; rest
|
||||
30.; rest
|
||||
31.; rest
|
||||
34.; rest
|
||||
35.; rest
|
||||
36.; rest
|
||||
37.; rest
|
||||
40.; rest
|
||||
41.; rest
|
||||
42.; rest
|
||||
43.; rest
|
||||
44.; rest
|
||||
45.; rest
|
||||
46.; rest
|
||||
47.; rest
|
||||
48.; rest
|
||||
60.; cc60
|
||||
61.; cc60
|
||||
62.; cc60
|
||||
63.; cc60
|
||||
64.; cc60
|
||||
65.; cc60
|
||||
66.; cc60
|
||||
67.; cc60
|
||||
68.; cc60
|
||||
69.; cc60
|
||||
70.; rest
|
||||
71.; rest
|
||||
72.; rest
|
||||
73.; rest
|
||||
74.; rest
|
||||
75.; rest
|
||||
76.; rest
|
||||
77.; rest
|
||||
78.; rest
|
||||
79.; rest
|
||||
80.; rest
|
||||
|
||||
/ relationals
|
||||
cc60:
|
||||
%a,z
|
||||
tstB1 A1
|
||||
|
||||
%n*,z
|
||||
F*
|
||||
tstB1 #1(R)
|
||||
|
||||
%n,z
|
||||
F
|
||||
tst R
|
||||
|
||||
%a,a
|
||||
cmpBE A1,A2
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
cmpBE #1(R),A2
|
||||
|
||||
%n,a
|
||||
F
|
||||
cmpB2 R,A2
|
||||
|
||||
%n*,e*
|
||||
F*
|
||||
S1*
|
||||
cmpBE #1(R),#2(R1)
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
cmpB1 #1(R),R1
|
||||
|
||||
%n,e*
|
||||
F
|
||||
S1*
|
||||
cmpB2 R,#2(R1)
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
cmp R,R1
|
||||
|
||||
%n*,n*
|
||||
FS*
|
||||
S*
|
||||
cmpBE (sp)+,#2(R)
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
cmpB1 *(sp)+,R
|
||||
|
||||
%n,n*
|
||||
FS
|
||||
S*
|
||||
cmpB2 (sp)+,#2(R)
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
cmp (sp)+,R
|
||||
|
||||
/ set codes right
|
||||
rest:
|
||||
%n,n
|
||||
H
|
||||
|
||||
.data
|
||||
.even
|
||||
.text
|
||||
|
357
last1120c/cvopt.c
Normal file
357
last1120c/cvopt.c
Normal file
@ -0,0 +1,357 @@
|
||||
main() {
|
||||
/*
|
||||
A1 -> A
|
||||
A2 B
|
||||
A O
|
||||
B1 C
|
||||
B2 D
|
||||
BE L
|
||||
BF P
|
||||
C1 E
|
||||
C2 F
|
||||
F G
|
||||
H H
|
||||
R I
|
||||
R1 J
|
||||
S K
|
||||
I M
|
||||
M N
|
||||
|
||||
* +1
|
||||
S +2
|
||||
C +4
|
||||
1 +8
|
||||
|
||||
z -> 4
|
||||
c 10
|
||||
a 14
|
||||
e 20
|
||||
n 63
|
||||
* +0100
|
||||
*/
|
||||
|
||||
extern putchar,getc,peekc,printf,flag,flush;
|
||||
|
||||
auto c,snlflg,nlflg,t,smode,m,ssmode;
|
||||
|
||||
smode = nlflg = snlflg = ssmode = 0;
|
||||
loop:
|
||||
c = getc();
|
||||
if (c!='\n' & c!='\t') nlflg = 0;
|
||||
if (ssmode!=0 & c!='%') {
|
||||
ssmode = 0;
|
||||
printf(".data\n1:<");
|
||||
}
|
||||
switch(c) {
|
||||
|
||||
case '\0':
|
||||
printf(".text; 0\n");
|
||||
flush();
|
||||
return;
|
||||
|
||||
case ':':
|
||||
if (!smode)
|
||||
printf("=.+2; 0"); else
|
||||
putchar(':');
|
||||
goto loop;
|
||||
|
||||
case 'A':
|
||||
if ((c=getc())=='1' | c=='2') {
|
||||
putchar(c+'A'-'1');
|
||||
goto loop;
|
||||
}
|
||||
putchar('O');
|
||||
peekc = c;
|
||||
goto loop;
|
||||
|
||||
case 'B':
|
||||
switch (getc()) {
|
||||
|
||||
case '1':
|
||||
putchar('C');
|
||||
goto loop;
|
||||
|
||||
case '2':
|
||||
putchar('D');
|
||||
goto loop;
|
||||
|
||||
case 'E':
|
||||
putchar('L');
|
||||
goto loop;
|
||||
|
||||
case 'F':
|
||||
putchar('P');
|
||||
goto loop;
|
||||
}
|
||||
putchar('?');
|
||||
goto loop;
|
||||
|
||||
case 'C':
|
||||
putchar(getc()+'E'-'1');
|
||||
goto loop;
|
||||
|
||||
case 'F':
|
||||
putchar('G');
|
||||
goto subtre;
|
||||
|
||||
case 'R':
|
||||
if ((c=getc()) == '1')
|
||||
putchar('J'); else {
|
||||
putchar('I');
|
||||
peekc = c;
|
||||
}
|
||||
goto loop;
|
||||
|
||||
case 'H':
|
||||
putchar('H');
|
||||
goto subtre;
|
||||
|
||||
case 'I':
|
||||
putchar('M');
|
||||
goto loop;
|
||||
|
||||
case 'M':
|
||||
putchar('N');
|
||||
snlflg++;
|
||||
goto loop;
|
||||
|
||||
case 'S':
|
||||
putchar('K');
|
||||
subtre:
|
||||
snlflg = 1;
|
||||
t = 'A';
|
||||
l1:
|
||||
switch (c=getc()) {
|
||||
|
||||
case '*':
|
||||
t++;
|
||||
goto l1;
|
||||
|
||||
case 'S':
|
||||
t =+ 2;
|
||||
goto l1;
|
||||
|
||||
case 'C':
|
||||
t =+ 4;
|
||||
goto l1;
|
||||
|
||||
case '1':
|
||||
t =+ 8;
|
||||
goto l1;
|
||||
}
|
||||
peekc = c;
|
||||
putchar(t);
|
||||
goto loop;
|
||||
|
||||
case '#':
|
||||
if(getc()=='1')
|
||||
putchar('#'); else
|
||||
putchar('"');
|
||||
goto loop;
|
||||
|
||||
case '%':
|
||||
if (smode)
|
||||
printf(".text;");
|
||||
loop1:
|
||||
switch (c=getc()) {
|
||||
|
||||
case 'a':
|
||||
m = 16;
|
||||
t = flag();
|
||||
goto pf;
|
||||
|
||||
case ',':
|
||||
putchar(';');
|
||||
goto loop1;
|
||||
|
||||
case 'i':
|
||||
m = 12;
|
||||
t = flag();
|
||||
goto pf;
|
||||
case 'z':
|
||||
m = 4;
|
||||
t = 0;
|
||||
goto pf;
|
||||
|
||||
case 'c':
|
||||
t = 0;
|
||||
m = 8;
|
||||
goto pf;
|
||||
|
||||
case 'e':
|
||||
t = flag();
|
||||
m = 20;
|
||||
goto pf;
|
||||
|
||||
case 'n':
|
||||
t = flag();
|
||||
m = 63;
|
||||
pf:
|
||||
if ((c=getc())=='*')
|
||||
m =+ 0100; else
|
||||
peekc = c;
|
||||
printf(".byte %o,%o", m, t);
|
||||
goto loop1;
|
||||
|
||||
case '\n':
|
||||
printf(";1f\n");
|
||||
ssmode = 1;
|
||||
nlflg = 1;
|
||||
smode = 1;
|
||||
goto loop;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop1;
|
||||
|
||||
case '\t':
|
||||
if (nlflg) {
|
||||
nlflg = 0;
|
||||
goto loop;
|
||||
}
|
||||
putchar('\t');
|
||||
goto loop;
|
||||
|
||||
case '\n':
|
||||
if (!smode) {
|
||||
putchar('\n');
|
||||
goto loop;
|
||||
}
|
||||
if (nlflg) {
|
||||
nlflg = 0;
|
||||
printf("\\0>\n.text\n");
|
||||
smode = 0;
|
||||
goto loop;
|
||||
}
|
||||
if (!snlflg)
|
||||
printf("\\n");
|
||||
snlflg = 0;
|
||||
printf(">\n<");
|
||||
nlflg = 1;
|
||||
goto loop;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
getc() {
|
||||
extern getchar, peekc, nofloat;
|
||||
auto t, ifcnt;
|
||||
|
||||
ifcnt = 0;
|
||||
gc:
|
||||
if (peekc) {
|
||||
t = peekc;
|
||||
peekc = 0;
|
||||
} else
|
||||
t = getchar();
|
||||
if (t==0)
|
||||
return(0);
|
||||
if (t=='{') {
|
||||
ifcnt++;
|
||||
t = getchar();
|
||||
}
|
||||
if (t=='}') {
|
||||
t = getc();
|
||||
if (--ifcnt==0)
|
||||
if (t=='\n')
|
||||
t = getc();
|
||||
}
|
||||
if (ifcnt & nofloat)
|
||||
goto gc;
|
||||
return(t);
|
||||
}
|
||||
|
||||
flag() {
|
||||
extern getc, peekc;
|
||||
auto c, f;
|
||||
|
||||
f = 0;
|
||||
l1:
|
||||
switch(c=getc()) {
|
||||
|
||||
case 'w':
|
||||
f = 1;
|
||||
goto l1;
|
||||
|
||||
case 'i':
|
||||
f = 2;
|
||||
goto l1;
|
||||
|
||||
case 'b':
|
||||
f = 3;
|
||||
goto l1;
|
||||
|
||||
case 'f':
|
||||
f = 4;
|
||||
goto l1;
|
||||
|
||||
case 'd':
|
||||
f = 5;
|
||||
goto l1;
|
||||
|
||||
case 'p':
|
||||
f =+ 16;
|
||||
goto l1;
|
||||
}
|
||||
peekc = c;
|
||||
return(f);
|
||||
}
|
||||
|
||||
peekc 0;
|
||||
|
||||
putchar(c) {
|
||||
extern flush, oubuf, ouptr;
|
||||
char ouptr[], oubuf[];
|
||||
auto c1;
|
||||
|
||||
goto init;
|
||||
init:
|
||||
ouptr = oubuf;
|
||||
init = init1;
|
||||
init1:
|
||||
if(c1 = c>>8) {
|
||||
*ouptr++ = c1;
|
||||
if(ouptr >= oubuf+512)
|
||||
flush();
|
||||
}
|
||||
if(c =& 0377) {
|
||||
*ouptr++ = c;
|
||||
if(ouptr >= oubuf+512)
|
||||
flush();
|
||||
}
|
||||
}
|
||||
|
||||
flush() {
|
||||
extern ouptr, oubuf, fout, write;
|
||||
char ouptr[], oubuf[];
|
||||
|
||||
write(fout, oubuf, ouptr-oubuf);
|
||||
ouptr = oubuf;
|
||||
}
|
||||
|
||||
getcha() {
|
||||
extern read, incnt, fin, inbuf, inptr;
|
||||
char inbuf[], inptr[];
|
||||
|
||||
goto init;
|
||||
init:
|
||||
inptr = inbuf;
|
||||
init = init1;
|
||||
init1:
|
||||
if(inptr >= inbuf+incnt) {
|
||||
inptr = inbuf;
|
||||
incnt = read(fin, inbuf, 512);
|
||||
if(!incnt)
|
||||
return('\0');
|
||||
}
|
||||
return(*inptr++);
|
||||
}
|
||||
|
||||
inbuf[256];
|
||||
oubuf[256];
|
||||
inptr 0;
|
||||
incnt 0;
|
||||
ouptr 0;
|
||||
fin 0;
|
||||
fout 1;
|
||||
nofloat 0;
|
215
last1120c/efftab.s
Normal file
215
last1120c/efftab.s
Normal file
@ -0,0 +1,215 @@
|
||||
/ c code tables
|
||||
|
||||
.globl _efftab
|
||||
|
||||
_efftab=.;.+2
|
||||
30.; ci30
|
||||
31.; ci30
|
||||
32.; ci30 / same as 30
|
||||
33.; ci30 / same as 31
|
||||
80.; ci80
|
||||
70.; ci70
|
||||
71.; ci70 / - like +
|
||||
77.; ci77
|
||||
78.; ci78
|
||||
0
|
||||
|
||||
/ ++ prefix
|
||||
ci30:
|
||||
%ai,n
|
||||
%abp,n
|
||||
%ab,n
|
||||
IB1 A1
|
||||
|
||||
%aip,n
|
||||
I' $2,A1
|
||||
|
||||
%nbp*,n
|
||||
%ni*,n
|
||||
%nb*,n
|
||||
F*
|
||||
IB1 #1(R)
|
||||
|
||||
%nip*,n
|
||||
F*
|
||||
I' $2,#1(R)
|
||||
|
||||
/ =
|
||||
ci80:
|
||||
%a,z
|
||||
clrB1 A1
|
||||
|
||||
%n*,z
|
||||
F*
|
||||
clrB1 #1(R)
|
||||
|
||||
%a,aw
|
||||
movB1 A2,A1
|
||||
|
||||
%a,nw*
|
||||
S*
|
||||
movB1 #2(R),A1
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 R,A1
|
||||
|
||||
%n*,aw
|
||||
F*
|
||||
movB1 A2,#1(R)
|
||||
|
||||
%n*,ew*
|
||||
F*
|
||||
S1*
|
||||
movB1 #2(R1),#1(R)
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
movB1 R1,#1(R)
|
||||
|
||||
%e*,nw*
|
||||
S*
|
||||
F1*
|
||||
movB1 #2(R),#1(R1)
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
movB1 R,#1(R1)
|
||||
|
||||
%n*,nw*
|
||||
FS*
|
||||
S*
|
||||
movB1 #2(R),*(sp)+
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
movB1 R,*(sp)+
|
||||
|
||||
/ =| i
|
||||
ci78:
|
||||
%a,a
|
||||
bisBE A2,A1
|
||||
|
||||
%a,n
|
||||
S
|
||||
bisB1 R,A1
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
bisBE A2,#1(R)
|
||||
|
||||
%e*,n*
|
||||
S*
|
||||
F1*
|
||||
bisBE #2(R),#1(R1)
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
bisBE R,#1(R1)
|
||||
|
||||
%n*,e*
|
||||
F*
|
||||
S1*
|
||||
bisBE #2(R1),#1(R)
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
bisBE R1,#1(R)
|
||||
|
||||
%n*,n*
|
||||
FS*
|
||||
S*
|
||||
bisBE #2(R),*(sp)+
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
bisBE R,*(sp)+
|
||||
|
||||
/ =& i
|
||||
ci77:
|
||||
%a,c
|
||||
bicB1 $!C2,A1
|
||||
|
||||
%a,n
|
||||
S
|
||||
com R
|
||||
bicB1 R,A1
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
com R
|
||||
bicB1 R,#1(R1)
|
||||
|
||||
%n*,c
|
||||
F*
|
||||
bicB1 $!C2,#1(R)
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
com R1
|
||||
bicB1 R1,#1(R)
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
com R
|
||||
bicB1 R,*(sp)+
|
||||
|
||||
/ =+
|
||||
ci70:
|
||||
%aw,aw
|
||||
I A2,A1
|
||||
|
||||
%aw,nw*
|
||||
S*
|
||||
I #2(R),A1
|
||||
|
||||
%aw,n
|
||||
S
|
||||
I R,A1
|
||||
|
||||
%ew*,nw*
|
||||
S*
|
||||
F1*
|
||||
I #2(R),#1(R1)
|
||||
|
||||
%a,nw*
|
||||
S*
|
||||
movB1 A1,R1
|
||||
I #2(R),R1
|
||||
movB1 R1,#2(R)
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,R1
|
||||
I R1,R
|
||||
movB1 R,A1
|
||||
|
||||
%ew*,n
|
||||
S
|
||||
F1*
|
||||
I R,#1(R1)
|
||||
|
||||
%nw*,n
|
||||
SS
|
||||
F*
|
||||
I (sp)+,#1(R)
|
||||
|
||||
%n*,n
|
||||
SS
|
||||
F*
|
||||
movB1 #1(R),R1
|
||||
I (sp)+,R1
|
||||
movB1 R1,#1(R)
|
||||
|
||||
.data
|
||||
.even
|
||||
|
696
last1120c/regtab.s
Normal file
696
last1120c/regtab.s
Normal file
@ -0,0 +1,696 @@
|
||||
/ c code tables-- compile to register
|
||||
|
||||
fp = 1 / enable floating-point
|
||||
|
||||
.globl _regtab
|
||||
|
||||
_regtab=.; .+2
|
||||
20.; cr20
|
||||
21.; cr20
|
||||
22.; cr20
|
||||
30.; cr30
|
||||
31.; cr30
|
||||
32.; cr32
|
||||
33.; cr32
|
||||
34.; cr34
|
||||
35.; cr35
|
||||
29.; cr29
|
||||
36.; cr36
|
||||
37.; cr37
|
||||
38.; cr38
|
||||
101.; cr100
|
||||
80.; cr80
|
||||
40.; cr40
|
||||
41.; cr40 / - like +
|
||||
42.; cr42
|
||||
43.; cr43
|
||||
44.; cr43
|
||||
45.; cr45
|
||||
46.; cr45
|
||||
47.; cr47
|
||||
48.; cr48
|
||||
60.; cr60
|
||||
61.; cr60
|
||||
62.; cr60
|
||||
63.; cr60
|
||||
64.; cr60
|
||||
65.; cr60
|
||||
66.; cr60
|
||||
67.; cr60
|
||||
68.; cr60
|
||||
69.; cr60
|
||||
70.; cr70
|
||||
71.; cr70
|
||||
72.; cr72
|
||||
73.; cr73
|
||||
74.; cr73
|
||||
75.; cr75
|
||||
76.; cr75
|
||||
77.; cr77
|
||||
78.; cr78
|
||||
102.; cr102
|
||||
97.; cr97
|
||||
0
|
||||
|
||||
/ goto
|
||||
cr102:
|
||||
%i,n
|
||||
jmp *A1
|
||||
|
||||
%n*,n
|
||||
F*
|
||||
jmp *#1(R)
|
||||
|
||||
%n,n
|
||||
F
|
||||
jmp (R)
|
||||
|
||||
/ call
|
||||
cr100:
|
||||
%n*,n
|
||||
F*
|
||||
jsr pc,*#1(R)
|
||||
|
||||
%a,n
|
||||
jsr pc,*A1
|
||||
|
||||
%n,n
|
||||
F
|
||||
jsr pc,(R)
|
||||
|
||||
/ name, constant
|
||||
cr20:
|
||||
%z,n
|
||||
clr R
|
||||
|
||||
%aw,n
|
||||
mov A,R
|
||||
|
||||
%ab,n
|
||||
movb A,R
|
||||
|
||||
.if fp
|
||||
%af,n
|
||||
M
|
||||
movf A,R
|
||||
|
||||
.endif
|
||||
|
||||
/++,-- prefix
|
||||
cr30:
|
||||
%ai,n
|
||||
%abp,n
|
||||
%ab,n
|
||||
IB1 A1
|
||||
movB1 A1,R
|
||||
|
||||
%a,n
|
||||
I' $2,A1
|
||||
mov A1,R
|
||||
|
||||
%nbp*,n
|
||||
%ni*,n
|
||||
%nb*,n
|
||||
F*
|
||||
IB1 #1(R)
|
||||
movB1 #1(R),R
|
||||
|
||||
%n*,n
|
||||
F*
|
||||
I' $2,#1(R)
|
||||
mov #1(R),R
|
||||
|
||||
/ ++,-- postfix
|
||||
cr32:
|
||||
%ai,n
|
||||
%abp,n
|
||||
%ab,n
|
||||
movB1 A1,R
|
||||
IB1 A1
|
||||
|
||||
%a,n
|
||||
mov A1,R
|
||||
I' $2,A1
|
||||
|
||||
%nbp*,n
|
||||
%nb*,n
|
||||
%ni*,n
|
||||
F*
|
||||
movB1 #1(R),-(sp)
|
||||
IB1 #1(R)
|
||||
movB1 (sp)+,R
|
||||
|
||||
%n*,n
|
||||
F*
|
||||
mov #1(R),-(sp)
|
||||
I' $2,#1(R)
|
||||
mov (sp)+,R
|
||||
|
||||
/ !
|
||||
cr34:
|
||||
%n,n
|
||||
FC
|
||||
beq 1f
|
||||
clr R
|
||||
br 2f
|
||||
1: mov $1,R
|
||||
2:
|
||||
|
||||
/ &unary
|
||||
cr35:
|
||||
%a,n
|
||||
mov $A1,R
|
||||
|
||||
/ & unary of auto
|
||||
cr29:
|
||||
%e,n
|
||||
mov r5,R
|
||||
add Z,R
|
||||
|
||||
/ *unary
|
||||
cr36:
|
||||
%abp*,n
|
||||
F
|
||||
movb (R),R
|
||||
|
||||
%a*,n
|
||||
F
|
||||
mov (R),R
|
||||
|
||||
%abp,n
|
||||
movb *A1,R
|
||||
|
||||
%a,n
|
||||
mov *A1,R
|
||||
|
||||
%nbp*,n
|
||||
F*
|
||||
movb *#1(R),R
|
||||
|
||||
%n*,n
|
||||
F*
|
||||
mov *#1(R),R
|
||||
|
||||
%nbp,n
|
||||
H*
|
||||
movb ~(R),R
|
||||
|
||||
%n,n
|
||||
H*
|
||||
mov ~(R),R
|
||||
|
||||
/ - unary
|
||||
cr37:
|
||||
%n,n
|
||||
F
|
||||
neg R
|
||||
|
||||
/ ~
|
||||
cr38:
|
||||
%n,n
|
||||
F
|
||||
com R
|
||||
|
||||
/ =
|
||||
cr80:
|
||||
%a,n
|
||||
S
|
||||
movB1 R,A1
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
movB1 A2,#1(R)
|
||||
movB1 #1(R),R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
movB1 R1,#1(R)
|
||||
mov R1,R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
movB1 R,*(sp)+
|
||||
|
||||
/ |
|
||||
cr48:
|
||||
%n,a
|
||||
F
|
||||
bisB2 A2,R
|
||||
|
||||
%n,e*
|
||||
F
|
||||
S1*
|
||||
bisB2 #2(R1),R
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
bis R1,R
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
bis (sp)+,R
|
||||
|
||||
/ &
|
||||
cr47:
|
||||
%n,c
|
||||
F
|
||||
bic $!C2,R
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
com R1
|
||||
bic R1,R
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
com (sp)
|
||||
bic (sp)+,R
|
||||
|
||||
/ relationals
|
||||
cr60:
|
||||
%n,n
|
||||
HC
|
||||
I 2f
|
||||
clr R
|
||||
br 1f
|
||||
2: mov $1,R
|
||||
1:
|
||||
|
||||
/ >>, <<
|
||||
cr45:
|
||||
%a,aw
|
||||
movB1 A1,I'
|
||||
I A2,lsh
|
||||
movB1 I',R
|
||||
|
||||
%n*,aw
|
||||
F*
|
||||
movB1 #1(R),I'
|
||||
I A2,lsh
|
||||
movB1 I',R
|
||||
|
||||
%n,aw
|
||||
F
|
||||
mov R,I'
|
||||
I A2,lsh
|
||||
mov I',R
|
||||
|
||||
%a,nw*
|
||||
S*
|
||||
movB1 A1,(r4)
|
||||
I #2(R),lsh
|
||||
mov (r4),R
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,I'
|
||||
I R,lsh
|
||||
mov I',R
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
mov (sp)+,I'
|
||||
I R,lsh
|
||||
mov I',R
|
||||
|
||||
/ +, -
|
||||
cr40:
|
||||
%n,aw
|
||||
F
|
||||
I A2,R
|
||||
|
||||
%n,ew*
|
||||
F
|
||||
S1*
|
||||
I #2(R1),R
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
I R1,R
|
||||
|
||||
%n,nw*
|
||||
SS*
|
||||
F
|
||||
I *(sp)+,R
|
||||
|
||||
%n,n
|
||||
SS
|
||||
F
|
||||
I (sp)+,R
|
||||
|
||||
/ *
|
||||
cr42:
|
||||
%aw,a
|
||||
mov A1,(r4)+
|
||||
movB2 A2,(r4)
|
||||
mov -(r4),R
|
||||
|
||||
%n,a
|
||||
F
|
||||
mov R,(r4)+
|
||||
movB2 A2,(r4)
|
||||
mov -(r4),R
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
mov R,(r4)+
|
||||
mov R1,(r4)
|
||||
mov -(r4),R
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
mov (sp)+,(r4)+
|
||||
mov R,(r4)
|
||||
mov -(r4),R
|
||||
|
||||
/ /; mod
|
||||
cr43:
|
||||
%a,a
|
||||
movB1 A1,(r4)
|
||||
movB2 A2,div
|
||||
mov I,R
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,(r4)
|
||||
mov R,div
|
||||
mov I,R
|
||||
|
||||
%n,a
|
||||
F
|
||||
mov R,(r4)
|
||||
movB2 A2,div
|
||||
mov I,R
|
||||
|
||||
%n,e
|
||||
F
|
||||
S1
|
||||
mov R,(r4)
|
||||
mov R1,div
|
||||
mov I,R
|
||||
|
||||
%e,n
|
||||
S
|
||||
F1
|
||||
mov R1,(r4)
|
||||
mov R,div
|
||||
mov I,R
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
mov (sp)+,(r4)
|
||||
mov R,div
|
||||
mov I,R
|
||||
|
||||
/ =*
|
||||
cr72:
|
||||
%a,a
|
||||
movB1 A1,(r4)
|
||||
movB2 A2,mul
|
||||
movB1 (r4),A1
|
||||
mov (r4),R
|
||||
|
||||
%a,n
|
||||
S
|
||||
mov R,(r4)+
|
||||
movB1 A1,(r4)
|
||||
mov -(r4),R
|
||||
movB1 R,A1
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
movB1 #1(R),(r4)
|
||||
movB2 A2,mul
|
||||
movB1 (r4),#1(R)
|
||||
mov (r4),R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
movB1 #1(R),(r4)
|
||||
mov R1,mul
|
||||
movB1 (r4),#1(R)
|
||||
mov (r4),R
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
movB1 #1(R1),(r4)
|
||||
mov R,mul
|
||||
movB1 (r4),#1(R1)
|
||||
mov (r4),R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
movB1 *(sp),(r4)
|
||||
mov R,mul
|
||||
movB1 (r4),*(sp)+
|
||||
mov (r4),R
|
||||
|
||||
/ =mod, =/
|
||||
cr73:
|
||||
%a,a
|
||||
movB1 A1,(r4)
|
||||
movB2 A2,div
|
||||
movB1 I,A1
|
||||
mov I,R
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,(r4)
|
||||
mov R,div
|
||||
mov I,R
|
||||
movB1 R,A1
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
movB1 #1(R),(r4)
|
||||
movB2 A2,div
|
||||
movB1 I,#1(R)
|
||||
mov I,R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
movB1 #1(R),(r4)
|
||||
mov R1,div
|
||||
movB1 I,#1(R)
|
||||
mov I,R
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
movB1 #1(R1),(r4)
|
||||
mov R,div
|
||||
movB1 I,#1(R1)
|
||||
mov I,R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
movB1 *(sp),(r4)
|
||||
mov R,div
|
||||
movB1 I,*(sp)+
|
||||
mov I,R
|
||||
|
||||
/ =|
|
||||
cr78:
|
||||
%a,a
|
||||
bisBE A2,A1
|
||||
movB1 A1,R
|
||||
|
||||
%a,n
|
||||
S
|
||||
bisB1 R,A1
|
||||
movB1 A1,R
|
||||
|
||||
%n*,a
|
||||
F*
|
||||
bisBE A2,#1(R)
|
||||
movB1 #1(R),R
|
||||
|
||||
%e*,n*
|
||||
S*
|
||||
F1*
|
||||
bisBE #1(R1),#2(R)
|
||||
movB1 #2(R),R
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
bisBE R,#1(R1)
|
||||
movB1 #1(R1),R
|
||||
|
||||
%n*,e*
|
||||
F*
|
||||
S1*
|
||||
bisBE #2(R1),#1(R)
|
||||
movB1 #1(R),R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
bisBE R1,#1(R)
|
||||
movB2 #1(R),R
|
||||
|
||||
%n*,n*
|
||||
FS*
|
||||
S*
|
||||
bisBE #2(R),*(sp)
|
||||
movB2 *(sp)+,R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
bisBE R,*(sp)
|
||||
mov *(sp)+,R
|
||||
|
||||
/ =&
|
||||
cr77:
|
||||
%a,c
|
||||
bicB1 $!C2,A1
|
||||
movB2 A1,R
|
||||
|
||||
%a,n
|
||||
S
|
||||
com R
|
||||
bicB1 R,A1
|
||||
movB1 A1,R
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
com R
|
||||
bicB1 R,#1(R1)
|
||||
movB1 #1(R1),R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
com R1
|
||||
bicB1 R1,#1(R)
|
||||
movB1 #1(R),R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
com R
|
||||
bicB1 R,*(sp)
|
||||
movB1 *(sp)+,R
|
||||
|
||||
/ =>>, =<<
|
||||
cr75:
|
||||
%a,aw
|
||||
movB1 A1,I'
|
||||
I A2,lsh
|
||||
movB1 I',A1
|
||||
movB1 I',R
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,I'
|
||||
I R,lsh
|
||||
movB1 I',A1
|
||||
movB1 I',R
|
||||
|
||||
%n*,e
|
||||
F*
|
||||
S1
|
||||
movB1 #1(R),I'
|
||||
I R1,lsh
|
||||
movB1 I',#1(R)
|
||||
movB1 I',R
|
||||
|
||||
%e*,n
|
||||
S
|
||||
F1*
|
||||
movB1 #1(R1),I'
|
||||
I R,lsh
|
||||
movB I',#1(R1)
|
||||
movB1 I',R
|
||||
|
||||
%n*,n
|
||||
FS*
|
||||
S
|
||||
movB1 *(sp),I'
|
||||
I R,lsh
|
||||
movB1 I',*(sp)+
|
||||
movB1 I',R
|
||||
|
||||
/ =+
|
||||
cr70:
|
||||
%aw,aw
|
||||
I A2,A1
|
||||
mov A1,R
|
||||
|
||||
%aw,nw*
|
||||
S*
|
||||
I #2(R),A1
|
||||
mov A1,R
|
||||
|
||||
%aw,n
|
||||
S
|
||||
I R,A1
|
||||
mov A1,R
|
||||
|
||||
%ew*,nw*
|
||||
S*
|
||||
F1*
|
||||
I #2(R),#1(R1)
|
||||
mov #1(R1),R
|
||||
|
||||
%a,nw*
|
||||
S*
|
||||
movB1 A1,R1
|
||||
I #2(R),R1
|
||||
movB1 R1,#2(R)
|
||||
mov R1,R
|
||||
|
||||
%a,n
|
||||
S
|
||||
movB1 A1,R1
|
||||
I R1,R
|
||||
movB1 R,A1
|
||||
|
||||
%ew*,n
|
||||
S
|
||||
F1*
|
||||
I R,#1(R1)
|
||||
mov #1(R1),R
|
||||
|
||||
%nw*,n
|
||||
SS
|
||||
F*
|
||||
I (sp)+,#1(R)
|
||||
mov #1(R),R
|
||||
|
||||
%n*,n
|
||||
SS
|
||||
F*
|
||||
movB1 #1(R),R1
|
||||
I (sp)+,R1
|
||||
movB1 R1,#1(R)
|
||||
mov R1,R
|
||||
|
||||
/ int -> int[]
|
||||
cr97:
|
||||
%n,n
|
||||
F
|
||||
asl R
|
||||
|
||||
.data
|
||||
.even
|
||||
.text
|
||||
|
167
last1120c/sptab.s
Normal file
167
last1120c/sptab.s
Normal file
@ -0,0 +1,167 @@
|
||||
/ c code tables-- expression to -(sp)
|
||||
|
||||
.globl _sptab
|
||||
|
||||
_sptab=.;.+2
|
||||
20.; cs20
|
||||
21.; cs21
|
||||
22.; cs21
|
||||
30.; cs30
|
||||
31.; cs30
|
||||
32.; cs32
|
||||
33.; cs32
|
||||
35.; cs35
|
||||
36.; cs36
|
||||
40.; cs40
|
||||
41.; cs40
|
||||
42.; cs42
|
||||
47.; cs47
|
||||
48.; cs48
|
||||
0
|
||||
|
||||
|
||||
/ name
|
||||
cs20:
|
||||
%aw,n
|
||||
mov A,-(sp)
|
||||
|
||||
/ constant
|
||||
cs21:
|
||||
%z,n
|
||||
clr -(sp)
|
||||
|
||||
%a,n
|
||||
mov A,-(sp)
|
||||
|
||||
/ ++,-- prefix
|
||||
cs30:
|
||||
%ai,n
|
||||
%abp,n
|
||||
I A1
|
||||
mov A1,-(sp)
|
||||
|
||||
%aw,n
|
||||
I' $2,A1
|
||||
mov A1,-(sp)
|
||||
|
||||
%nbp*,n
|
||||
%ni*,n
|
||||
F*
|
||||
I #1(R)
|
||||
mov #1(R),-(sp)
|
||||
|
||||
%nip*,n
|
||||
F*
|
||||
mov #1(R),-(sp)
|
||||
I' $2,#1(R)
|
||||
|
||||
/ ++,-- postfix
|
||||
cs32:
|
||||
%ai,n
|
||||
%abp,n
|
||||
mov A1,-(sp)
|
||||
I A1
|
||||
|
||||
%aip,n
|
||||
mov A1,-(sp)
|
||||
I' $2,A1
|
||||
|
||||
%nbp*,n
|
||||
%ni*,n
|
||||
F*
|
||||
mov #1(R),-(sp)
|
||||
I #1(R)
|
||||
|
||||
%nip*,n
|
||||
F*
|
||||
mov #1(R),-(sp)
|
||||
I' $2,#1(R)
|
||||
|
||||
/ & unary
|
||||
cs35:
|
||||
%i,n
|
||||
mov $A1,-(sp)
|
||||
|
||||
/ * unary
|
||||
cs36:
|
||||
%aw,n
|
||||
mov *A1,-(sp)
|
||||
|
||||
%nw*,n
|
||||
F*
|
||||
mov #1(R),-(sp)
|
||||
|
||||
/ +
|
||||
cs40:
|
||||
%n,aw
|
||||
FS
|
||||
I A2,(sp)
|
||||
|
||||
%n,nw*
|
||||
FS
|
||||
S*
|
||||
I #2(R),(sp)
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
I R,(sp)
|
||||
|
||||
/ *
|
||||
cs42:
|
||||
%aw,a
|
||||
mov A1,(r4)+
|
||||
movB2 A2,(r4)
|
||||
mov -(r4),-(sp)
|
||||
|
||||
%n,a
|
||||
F
|
||||
mov R,(r4)+
|
||||
movB2 A2,(r4)
|
||||
mov -(r4),-(sp)
|
||||
|
||||
%n,nw*
|
||||
FS
|
||||
S*
|
||||
mov (sp)+,(r4)+
|
||||
mov #2(R),(r4)
|
||||
mov -(r4),-(sp)
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
mov (sp)+,(r4)+
|
||||
mov R,(r4)
|
||||
mov -(r4),-(sp)
|
||||
|
||||
/ &
|
||||
cs47:
|
||||
%n,c
|
||||
FS
|
||||
bic $!C2,(sp)
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
com R
|
||||
bic R,(sp)
|
||||
|
||||
/ |
|
||||
cs48:
|
||||
%n,a
|
||||
FS
|
||||
bisB2 A2,(sp)
|
||||
|
||||
%n,n*
|
||||
FS
|
||||
S*
|
||||
bisB2 #2(R),(sp)
|
||||
|
||||
%n,n
|
||||
FS
|
||||
S
|
||||
bis R,(sp)
|
||||
|
||||
.data
|
||||
.even
|
||||
.text
|
776
prestruct/c00.c
Normal file
776
prestruct/c00.c
Normal file
@ -0,0 +1,776 @@
|
||||
/* C compiler
|
||||
|
||||
Copyright 1972 Bell Telephone Laboratories, Inc.
|
||||
|
||||
*/
|
||||
|
||||
init(s, t)
|
||||
char s[]; {
|
||||
extern symbuf, namsiz;
|
||||
char symbuf[], sp[];
|
||||
int np[], i;
|
||||
|
||||
i = namsiz;
|
||||
sp = symbuf;
|
||||
while(i--)
|
||||
if ((*sp++ = *s++)=='\0') --s;
|
||||
np = lookup();
|
||||
*np++ = 1;
|
||||
*np = t;
|
||||
}
|
||||
|
||||
main(argc, argv)
|
||||
int argv[]; {
|
||||
extern extdef, eof;
|
||||
extern fout, fin, nerror, tmpfil, xdflg;
|
||||
|
||||
if(argc<4) {
|
||||
error("Arg count");
|
||||
exit(1);
|
||||
}
|
||||
if((fin=open(argv[1],0))<0) {
|
||||
error("Can't find %s", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if((fout=creat(argv[2], 017))<0) {
|
||||
error("Can't create %s", argv[2]);
|
||||
exit(1);
|
||||
}
|
||||
tmpfil = argv[3];
|
||||
xdflg++;
|
||||
init("int", 0);
|
||||
init("char", 1);
|
||||
init("float", 2);
|
||||
init("double", 3);
|
||||
init("struct", 4);
|
||||
init("auto", 5);
|
||||
init("extern", 6);
|
||||
init("static", 7);
|
||||
init("goto", 10);
|
||||
init("return", 11);
|
||||
init("if", 12);
|
||||
init("while", 13);
|
||||
init("else", 14);
|
||||
init("switch", 15);
|
||||
init("case", 16);
|
||||
init("break", 17);
|
||||
init("continue", 18);
|
||||
init("do", 19);
|
||||
init("default", 20);
|
||||
xdflg = 0;
|
||||
while(!eof) {
|
||||
extdef();
|
||||
blkend();
|
||||
}
|
||||
flush();
|
||||
flshw();
|
||||
exit(nerror!=0);
|
||||
}
|
||||
|
||||
lookup() {
|
||||
extern hshtab, hshsiz, pssiz, symbuf, xdflg;
|
||||
int hshtab[], symbuf[];
|
||||
extern hshlen, hshused, nwps;
|
||||
auto i, j, np[], sp[], rp[];
|
||||
|
||||
i = 0;
|
||||
sp = symbuf;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
i =+ *sp++ & 077577;
|
||||
if (i<0) i = -i;
|
||||
i =% hshsiz;
|
||||
i =* pssiz;
|
||||
while(*(np = &hshtab[i+4])) {
|
||||
sp = symbuf;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
if ((*np++&077577) != *sp++) goto no;
|
||||
return(&hshtab[i]);
|
||||
no: if ((i =+ pssiz) >= hshlen) i = 0;
|
||||
}
|
||||
if(++hshused > hshsiz) {
|
||||
error("Symbol table overflow");
|
||||
exit(1);
|
||||
}
|
||||
rp = np = &hshtab[i];
|
||||
sp = symbuf;
|
||||
j = 4;
|
||||
while(j--)
|
||||
*np++ = 0;
|
||||
j = nwps;
|
||||
while(j--)
|
||||
*np++ = *sp++;
|
||||
*np = 0;
|
||||
if (xdflg)
|
||||
rp[4] =| 0200; /* mark non-deletable */
|
||||
return(rp);
|
||||
}
|
||||
|
||||
symbol() {
|
||||
extern peeksym, peekc, eof, line;
|
||||
extern csym, symbuf, namsiz, lookup, ctab, cval;
|
||||
int csym[];
|
||||
extern isn, mosflg, xdflg;
|
||||
auto b, c;
|
||||
char symbuf[], sp[], ctab[];
|
||||
|
||||
if (peeksym>=0) {
|
||||
c = peeksym;
|
||||
peeksym = -1;
|
||||
if (c==20)
|
||||
mosflg = 0;
|
||||
return(c);
|
||||
}
|
||||
if (peekc) {
|
||||
c = peekc;
|
||||
peekc = 0;
|
||||
} else
|
||||
if (eof)
|
||||
return(0); else
|
||||
c = getchar();
|
||||
loop:
|
||||
switch(ctab[c]) {
|
||||
|
||||
case 125: /* newline */
|
||||
line++;
|
||||
|
||||
case 126: /* white space */
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
case 0: /* EOF */
|
||||
eof++;
|
||||
return(0);
|
||||
|
||||
case 40: /* + */
|
||||
return(subseq(c,40,30));
|
||||
|
||||
case 41: /* - */
|
||||
return(subseq(c,subseq('>',41,50),31));
|
||||
|
||||
case 80: /* = */
|
||||
if (subseq(' ',0,1)) return(80);
|
||||
c = symbol();
|
||||
if (c>=40 & c<=49)
|
||||
return(c+30);
|
||||
if (c==80)
|
||||
return(60);
|
||||
peeksym = c;
|
||||
return(80);
|
||||
|
||||
case 63: /* < */
|
||||
if (subseq(c,0,1)) return(46);
|
||||
return(subseq('=',63,62));
|
||||
|
||||
case 65: /* > */
|
||||
if (subseq(c,0,1)) return(45);
|
||||
return(subseq('=',65,64));
|
||||
|
||||
case 34: /* ! */
|
||||
return(subseq('=',34,61));
|
||||
|
||||
case 43: /* / */
|
||||
if (subseq('*',1,0))
|
||||
return(43);
|
||||
com:
|
||||
c = getchar();
|
||||
com1:
|
||||
if (c=='\0') {
|
||||
eof++;
|
||||
error("Nonterminated comment");
|
||||
return(0);
|
||||
}
|
||||
if (c=='\n')
|
||||
line++;
|
||||
if (c!='*')
|
||||
goto com;
|
||||
c = getchar();
|
||||
if (c!='/')
|
||||
goto com1;
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
case 120: /* . */
|
||||
case 124: /* number */
|
||||
peekc = c;
|
||||
switch(c=getnum(c=='0'? 8:10)) {
|
||||
case 25: /* float 0 */
|
||||
c = 23;
|
||||
break;
|
||||
|
||||
case 23: /* float non 0 */
|
||||
cval = isn++;
|
||||
}
|
||||
return(c);
|
||||
|
||||
case 122: /* " */
|
||||
return(getstr());
|
||||
|
||||
case 121: /* ' */
|
||||
return(getcc());
|
||||
|
||||
case 123: /* letter */
|
||||
sp = symbuf;
|
||||
if (mosflg) {
|
||||
*sp++ = '.';
|
||||
mosflg = 0;
|
||||
}
|
||||
while(ctab[c]==123 | ctab[c]==124) {
|
||||
if (sp<symbuf+namsiz) *sp++ = c;
|
||||
c = getchar();
|
||||
}
|
||||
while(sp<symbuf+namsiz)
|
||||
*sp++ = '\0';
|
||||
peekc = c;
|
||||
csym = lookup();
|
||||
if (csym[0]==1) { /* keyword */
|
||||
cval = csym[1];
|
||||
return(19);
|
||||
}
|
||||
return(20);
|
||||
|
||||
case 127: /* unknown */
|
||||
error("Unknown character");
|
||||
c = getchar();
|
||||
goto loop;
|
||||
|
||||
}
|
||||
return(ctab[c]);
|
||||
}
|
||||
|
||||
subseq(c,a,b) {
|
||||
extern peekc;
|
||||
|
||||
if (!peekc)
|
||||
peekc = getchar();
|
||||
if (peekc != c)
|
||||
return(a);
|
||||
peekc = 0;
|
||||
return(b);
|
||||
}
|
||||
getstr() {
|
||||
extern isn, cval, strflg;
|
||||
auto c;
|
||||
char t[], d[];
|
||||
|
||||
t = ".text";
|
||||
d = ".data";
|
||||
printf("%s;L%d:.byte ", (strflg?t:d), cval=isn++);
|
||||
while((c=mapch('"')) >= 0)
|
||||
printf("%o,", c);
|
||||
printf("0;.even;%s\n", (strflg?d:t));
|
||||
return(22);
|
||||
}
|
||||
|
||||
getcc()
|
||||
{
|
||||
extern cval, ncpw;
|
||||
auto c, cc;
|
||||
char cp[];
|
||||
|
||||
cval = 0;
|
||||
cp = &cval;
|
||||
cc = 0;
|
||||
while((c=mapch('\'')) >= 0)
|
||||
if(cc++ < ncpw)
|
||||
*cp++ = c;
|
||||
if(cc>ncpw)
|
||||
error("Long character constant");
|
||||
return(21);
|
||||
}
|
||||
|
||||
mapch(c)
|
||||
{
|
||||
extern peekc, line;
|
||||
auto a;
|
||||
|
||||
if((a=getchar())==c)
|
||||
return(-1);
|
||||
switch(a) {
|
||||
|
||||
case '\n':
|
||||
case 0:
|
||||
error("Nonterminated string");
|
||||
peekc = a;
|
||||
return(-1);
|
||||
|
||||
case '\\':
|
||||
switch (a=getchar()) {
|
||||
|
||||
case 't':
|
||||
return('\t');
|
||||
|
||||
case 'n':
|
||||
return('\n');
|
||||
|
||||
case '0':
|
||||
return('\0');
|
||||
|
||||
case 'r':
|
||||
return('\r');
|
||||
|
||||
case '\n':
|
||||
line++;
|
||||
return('\n');
|
||||
}
|
||||
|
||||
}
|
||||
return(a);
|
||||
}
|
||||
|
||||
tree() {
|
||||
extern csym, ctyp, isn, fcval, peeksym, opdope, cp, cmst;
|
||||
int csym[], opdope[], cp[], cmst[];
|
||||
extern space, cval, ossiz, cmsiz, mosflg, osleft;
|
||||
double fcval;
|
||||
int space[];
|
||||
|
||||
int op[], opst[20], pp[], prst[20], andflg, o,
|
||||
p, ps, os;
|
||||
|
||||
osleft = ossiz;
|
||||
space = 0;
|
||||
*space++ = 0;
|
||||
op = opst;
|
||||
pp = prst;
|
||||
cp = cmst;
|
||||
*op = 200; /* stack EOF */
|
||||
*pp = 06;
|
||||
andflg = 0;
|
||||
|
||||
advanc:
|
||||
switch (o=symbol()) {
|
||||
|
||||
/* name */
|
||||
case 20:
|
||||
if (*csym==0)
|
||||
if((peeksym=symbol())==6) { /* ( */
|
||||
*csym = 6; /* extern */
|
||||
csym[1] = 020; /* int() */
|
||||
} else {
|
||||
csym[1] = 030; /* array */
|
||||
if (csym[2]==0)
|
||||
csym[2] = isn++;
|
||||
}
|
||||
*cp++ = block(2,20,csym[1],csym[3],*csym,0);
|
||||
if (*csym==6) { /* external */
|
||||
o = 3;
|
||||
while(++o<8) {
|
||||
pblock(csym[o]);
|
||||
if ((csym[o]&077400) == 0)
|
||||
break;
|
||||
}
|
||||
} else
|
||||
pblock(csym[2]);
|
||||
goto tand;
|
||||
|
||||
/* short constant */
|
||||
case 21:
|
||||
case21:
|
||||
*cp++ = block(1,21,ctyp,0,cval);
|
||||
goto tand;
|
||||
|
||||
/* floating constant */
|
||||
case 23:
|
||||
*cp++ = block(1,23,3,0,cval);
|
||||
if (cval) /* non-0 */
|
||||
printf(".data;L%d:%o;%o;%o;%o;.text\n",cval,fcval);
|
||||
goto tand;
|
||||
|
||||
/* string constant: fake a static char array */
|
||||
case 22:
|
||||
*cp++ = block(3, 20, 031, 1, 7, 0, cval);
|
||||
|
||||
tand:
|
||||
if(cp>=cmst+cmsiz) {
|
||||
error("Expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
if (andflg)
|
||||
goto syntax;
|
||||
andflg = 1;
|
||||
goto advanc;
|
||||
|
||||
/* ++, -- */
|
||||
case 30:
|
||||
case 31:
|
||||
if (andflg)
|
||||
o =+ 2;
|
||||
goto oponst;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
/* ~ */
|
||||
case 38:
|
||||
if (andflg)
|
||||
goto syntax;
|
||||
goto oponst;
|
||||
|
||||
/* - */
|
||||
case 41:
|
||||
if (!andflg) {
|
||||
peeksym = symbol();
|
||||
if (peeksym==21) {
|
||||
peeksym = -1;
|
||||
cval = -cval;
|
||||
goto case21;
|
||||
}
|
||||
o = 37;
|
||||
}
|
||||
andflg = 0;
|
||||
goto oponst;
|
||||
|
||||
/* & */
|
||||
/* * */
|
||||
case 47:
|
||||
case 42:
|
||||
if (andflg)
|
||||
andflg = 0; else
|
||||
if(o==47)
|
||||
o = 35;
|
||||
else
|
||||
o = 36;
|
||||
goto oponst;
|
||||
|
||||
/* ( */
|
||||
case 6:
|
||||
if (andflg) {
|
||||
o = symbol();
|
||||
if (o==7)
|
||||
o = 101; else {
|
||||
peeksym = o;
|
||||
o = 100;
|
||||
andflg = 0;
|
||||
}
|
||||
}
|
||||
goto oponst;
|
||||
|
||||
/* ) */
|
||||
/* ] */
|
||||
case 5:
|
||||
case 7:
|
||||
if (!andflg)
|
||||
goto syntax;
|
||||
goto oponst;
|
||||
|
||||
case 39: /* . */
|
||||
mosflg++;
|
||||
break;
|
||||
|
||||
}
|
||||
/* binaries */
|
||||
if (!andflg)
|
||||
goto syntax;
|
||||
andflg = 0;
|
||||
|
||||
oponst:
|
||||
p = (opdope[o]>>9) & 077;
|
||||
opon1:
|
||||
ps = *pp;
|
||||
if (p>ps | p==ps & (opdope[o]&0200)!=0) { /* right-assoc */
|
||||
putin:
|
||||
switch (o) {
|
||||
|
||||
case 6: /* ( */
|
||||
case 4: /* [ */
|
||||
case 100: /* call */
|
||||
p = 04;
|
||||
}
|
||||
if(op>=opst+20) { /* opstack size */
|
||||
error("expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
*++op = o;
|
||||
*++pp = p;
|
||||
goto advanc;
|
||||
}
|
||||
--pp;
|
||||
switch (os = *op--) {
|
||||
|
||||
/* EOF */
|
||||
case 200:
|
||||
peeksym = o;
|
||||
return(*--cp);
|
||||
|
||||
/* call */
|
||||
case 100:
|
||||
if (o!=7)
|
||||
goto syntax;
|
||||
build(os);
|
||||
goto advanc;
|
||||
|
||||
/* mcall */
|
||||
case 101:
|
||||
*cp++ = block(0,0,0,0); /* 0 arg call */
|
||||
os = 100;
|
||||
goto fbuild;
|
||||
|
||||
/* ( */
|
||||
case 6:
|
||||
if (o!=7)
|
||||
goto syntax;
|
||||
goto advanc;
|
||||
|
||||
/* [ */
|
||||
case 4:
|
||||
if (o!=5)
|
||||
goto syntax;
|
||||
build(4);
|
||||
goto advanc;
|
||||
}
|
||||
fbuild:
|
||||
build(os);
|
||||
goto opon1;
|
||||
|
||||
syntax:
|
||||
error("Expression syntax");
|
||||
errflush(o);
|
||||
return(0);
|
||||
}
|
||||
|
||||
scdeclare(kw)
|
||||
{
|
||||
extern csym, paraml, parame, peeksym;
|
||||
int csym[], paraml[], parame[];
|
||||
int o;
|
||||
|
||||
while((o=symbol())==20) { /* name */
|
||||
if(*csym>0 & *csym!=kw)
|
||||
redec();
|
||||
*csym = kw;
|
||||
if(kw==8) { /* parameter */
|
||||
*csym = -1;
|
||||
if (paraml==0)
|
||||
paraml = csym;
|
||||
else
|
||||
*parame = csym;
|
||||
parame = csym;
|
||||
}
|
||||
if ((o=symbol())!=9) /* , */
|
||||
break;
|
||||
}
|
||||
if(o==1 & kw!=8 | o==7 & kw==8)
|
||||
return;
|
||||
syntax:
|
||||
decsyn(o);
|
||||
}
|
||||
|
||||
tdeclare(kw, offset, mos)
|
||||
{
|
||||
int o, elsize, ds[];
|
||||
extern xdflg, peeksym, mosflg, defsym, csym;
|
||||
int csym[], ssym[];
|
||||
|
||||
if (kw == 4) { /* struct */
|
||||
ssym = 0;
|
||||
ds = defsym;
|
||||
mosflg = mos;
|
||||
if ((o=symbol())==20) { /* name */
|
||||
ssym = csym;
|
||||
o = symbol();
|
||||
}
|
||||
mosflg = mos;
|
||||
if (o != 6) { /* ( */
|
||||
if (ssym==0)
|
||||
goto syntax;
|
||||
if (*ssym!=8) /* class structname */
|
||||
error("Bad structure name");
|
||||
if (ssym[3]==0) { /* no size yet */
|
||||
kw = 5; /* deferred MOS */
|
||||
elsize = ssym;
|
||||
} else
|
||||
elsize = ssym[3];
|
||||
peeksym = o;
|
||||
} else {
|
||||
if (ssym) {
|
||||
if (*ssym)
|
||||
redec();
|
||||
*ssym = 8;
|
||||
ssym[3] = 0;
|
||||
}
|
||||
elsize = declist(4);
|
||||
if ((elsize&01) != 0)
|
||||
elsize++;
|
||||
defsym = ds;
|
||||
if ((o = symbol()) != 7) /* ) */
|
||||
goto syntax;
|
||||
if (ssym)
|
||||
ssym[3] = elsize;
|
||||
}
|
||||
}
|
||||
mosflg = mos;
|
||||
if ((peeksym=symbol()) == 1) { /* ; */
|
||||
peeksym = -1;
|
||||
mosflg = 0;
|
||||
return(offset);
|
||||
}
|
||||
do {
|
||||
offset =+ t1dec(kw, offset, mos, elsize);
|
||||
if (xdflg & !mos)
|
||||
return;
|
||||
} while ((o=symbol()) == 9); /* , */
|
||||
if (o==1)
|
||||
return(offset);
|
||||
syntax:
|
||||
decsyn(o);
|
||||
}
|
||||
|
||||
t1dec(kw, offset, mos, elsize)
|
||||
{
|
||||
int type, nel, defsym[], t1;
|
||||
extern defsym, mosflg;
|
||||
|
||||
nel = 0;
|
||||
mosflg = mos;
|
||||
if ((t1=getype(&nel)) < 0)
|
||||
goto syntax;
|
||||
type = 0;
|
||||
do
|
||||
type = type<<2 | (t1 & 03);
|
||||
while(t1 =>> 2);
|
||||
t1 = type<<3 | kw;
|
||||
if (defsym[1] & defsym[1]!=t1)
|
||||
redec();
|
||||
defsym[1] = t1;
|
||||
defsym[3] = elsize;
|
||||
elsize = length(defsym);
|
||||
if (mos) {
|
||||
if (*defsym)
|
||||
redec();
|
||||
else
|
||||
*defsym = 4;
|
||||
if ((offset&1)!=0 & elsize!=1)
|
||||
offset++;
|
||||
defsym[2] = offset;
|
||||
} else
|
||||
if (*defsym == 0)
|
||||
*defsym = -2; /* default auto */
|
||||
if (nel==0)
|
||||
nel = 1;
|
||||
defsym[8] = nel;
|
||||
syntax:
|
||||
return(nel*elsize);
|
||||
}
|
||||
|
||||
getype(pnel)
|
||||
int pnel[];
|
||||
{
|
||||
int o, type;
|
||||
extern cval, peeksym, xdflg, defsym, csym, pssiz;
|
||||
int defsym[], csym[];
|
||||
|
||||
switch(o=symbol()) {
|
||||
|
||||
case 42: /* * */
|
||||
return(getype(pnel)<<2 | 01);
|
||||
|
||||
case 6: /* ( */
|
||||
type = getype(pnel);
|
||||
if ((o=symbol()) != 7) /* ) */
|
||||
goto syntax;
|
||||
goto getf;
|
||||
|
||||
case 20: /* name */
|
||||
defsym = csym;
|
||||
type = 0;
|
||||
getf:
|
||||
switch(o=symbol()) {
|
||||
|
||||
case 6: /* ( */
|
||||
if (xdflg) {
|
||||
xdflg = 0;
|
||||
o = defsym;
|
||||
scdeclare(8);
|
||||
defsym = o;
|
||||
xdflg++;
|
||||
} else
|
||||
if ((o=symbol()) != 7) /* ) */
|
||||
goto syntax;
|
||||
type = type<<2 | 02;
|
||||
goto getf;
|
||||
|
||||
case 4: /* [ */
|
||||
if ((o=symbol()) != 5) { /* ] */
|
||||
if (o!=21) /* const */
|
||||
goto syntax;
|
||||
*pnel = cval;
|
||||
if ((o=symbol())!=5)
|
||||
goto syntax;
|
||||
}
|
||||
type = type<<2 | 03;
|
||||
goto getf;
|
||||
}
|
||||
peeksym = o;
|
||||
return(type);
|
||||
}
|
||||
syntax:
|
||||
decsyn(o);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
decsyn(o)
|
||||
{
|
||||
error("Declaration syntax");
|
||||
errflush(o);
|
||||
}
|
||||
|
||||
redec()
|
||||
{
|
||||
extern csym;
|
||||
int csym[];
|
||||
|
||||
error("%p redeclared", &csym[4]);
|
||||
}
|
||||
|
||||
/* storage */
|
||||
|
||||
regtab 0;
|
||||
efftab 1;
|
||||
cctab 2;
|
||||
sptab 3;
|
||||
symbuf[4];
|
||||
pssiz 9;
|
||||
namsiz 8;
|
||||
nwps 4;
|
||||
hshused;
|
||||
hshsiz 100;
|
||||
hshlen 900; /* 9*hshsiz */
|
||||
hshtab[900];
|
||||
space;
|
||||
cp;
|
||||
cmsiz 40;
|
||||
cmst[40];
|
||||
ctyp;
|
||||
isn 1;
|
||||
swsiz 120;
|
||||
swtab[120];
|
||||
swp;
|
||||
contlab;
|
||||
brklab;
|
||||
deflab;
|
||||
nreg 4;
|
||||
nauto;
|
||||
stack;
|
||||
peeksym 0177777;
|
||||
peekc;
|
||||
eof;
|
||||
line 1;
|
||||
defsym;
|
||||
xdflg;
|
||||
csym;
|
||||
cval;
|
||||
fcval 0; /* a double number */
|
||||
fc1 0;
|
||||
fc2 0;
|
||||
fc3 0;
|
||||
ncpw 2;
|
||||
nerror;
|
||||
paraml;
|
||||
parame;
|
||||
tmpfil;
|
||||
strflg;
|
||||
ossiz 250;
|
||||
osleft;
|
||||
mosflg;
|
||||
debug 0;
|
369
prestruct/c01.c
Normal file
369
prestruct/c01.c
Normal file
@ -0,0 +1,369 @@
|
||||
build(op) {
|
||||
extern cp[], cvtab, opdope[], maprel[];
|
||||
auto p1[], t1, d1, p2[], t2, d2, p3[], t3, d3, t;
|
||||
auto d, dope, leftc, cvn, pcvn;
|
||||
char cvtab[];
|
||||
|
||||
if (op==4) { /* [] */
|
||||
build(40); /* + */
|
||||
op = 36; /* * */
|
||||
}
|
||||
dope = opdope[op];
|
||||
if ((dope&01)!=0) { /* binary */
|
||||
p2 = disarray(*--cp);
|
||||
t2 = p2[1];
|
||||
chkfun(p2);
|
||||
d2 = p2[2];
|
||||
if (*p2==20)
|
||||
d2 = 0;
|
||||
}
|
||||
p1 = disarray(*--cp);
|
||||
if (op!=100 & op!=35) /* call, * */
|
||||
chkfun(p1);
|
||||
t1 = p1[1];
|
||||
d1 = p1[2];
|
||||
if (*p1==20)
|
||||
d1 = 0;
|
||||
pcvn = 0;
|
||||
switch (op) {
|
||||
|
||||
/* : */
|
||||
case 8:
|
||||
if (t1!=t2)
|
||||
error("Type clash in conditional");
|
||||
t = t1;
|
||||
goto nocv;
|
||||
|
||||
/* , */
|
||||
case 9:
|
||||
*cp++ = block(2, 9, 0, 0, p1, p2);
|
||||
return;
|
||||
|
||||
/* ? */
|
||||
case 90:
|
||||
if (*p2!=8)
|
||||
error("Illegal conditional");
|
||||
t = t2;
|
||||
goto nocv;
|
||||
|
||||
/* call */
|
||||
case 100:
|
||||
if ((t1&030) != 020)
|
||||
error("Call of non-function");
|
||||
*cp++ = block(2,100,decref(t1),24,p1,p2);
|
||||
return;
|
||||
|
||||
/* * */
|
||||
case 36:
|
||||
if (*p1==35 | *p1==29) { /* & unary */
|
||||
*cp++ = p1[3];
|
||||
return;
|
||||
}
|
||||
if (*p1!=20 & d1==0)
|
||||
d1 = 1;
|
||||
if ((t1&030) == 020) /* function */
|
||||
error("Illegal indirection");
|
||||
*cp++ = block(1,36,decref(t1),d1,p1);
|
||||
return;
|
||||
|
||||
/* & unary */
|
||||
case 35:
|
||||
if (*p1==36) { /* * */
|
||||
*cp++ = p1[3];
|
||||
return;
|
||||
}
|
||||
if (*p1==20) {
|
||||
*cp++ = block(1,p1[3]==5?29:35,incref(t1),1,p1);
|
||||
return;
|
||||
}
|
||||
error("Illegal lvalue");
|
||||
break;
|
||||
|
||||
case 43: /* / */
|
||||
case 44: /* % */
|
||||
case 73: /* =/ */
|
||||
case 74: /* =% */
|
||||
d1++;
|
||||
d2++;
|
||||
|
||||
case 42: /* * */
|
||||
case 72: /* =* */
|
||||
d1++;
|
||||
d2++;
|
||||
break;
|
||||
|
||||
case 30: /* ++ -- pre and post */
|
||||
case 31:
|
||||
case 32:
|
||||
case 33:
|
||||
chklval(p1);
|
||||
*cp++ = block(2,op,t1,max(d1,1),p1,plength(p1));
|
||||
return;
|
||||
|
||||
case 39: /* . (structure ref) */
|
||||
case 50: /* -> (indirect structure ref) */
|
||||
if (p2[0]!=20 | p2[3]!=4) /* not mos */
|
||||
error("Illegal structure ref");
|
||||
*cp++ = p1;
|
||||
t = t2;
|
||||
if ((t&030) == 030) /* array */
|
||||
t = decref(t);
|
||||
setype(p1, t);
|
||||
if (op==39) /* is "." */
|
||||
build(35); /* unary & */
|
||||
*cp++ = block(1,21,7,0,p2[5]);
|
||||
build(40); /* + */
|
||||
if ((t2&030) != 030) /* not array */
|
||||
build(36); /* unary * */
|
||||
return;
|
||||
}
|
||||
if ((dope&02)!=0) /* lvalue needed on left? */
|
||||
chklval(p1);
|
||||
if ((dope&020)!=0) /* word operand on left? */
|
||||
chkw(p1);
|
||||
if ((dope&040)!=0) /* word operand on right? */
|
||||
chkw(p2);
|
||||
if ((dope&01)==0) { /* unary op? */
|
||||
*cp++ = block(1,op,t1,max(d1,1),p1);
|
||||
return;
|
||||
}
|
||||
if (t2==7) {
|
||||
t = t1;
|
||||
p2[1] = 0; /* no int cv for struct */
|
||||
t2 = 0;
|
||||
goto nocv;
|
||||
}
|
||||
cvn = cvtab[11*lintyp(t1)+lintyp(t2)];
|
||||
leftc = cvn&0100;
|
||||
t = leftc? t2:t1;
|
||||
if (op==80 & t1!=4 & t2!=4) { /* = */
|
||||
t = t1;
|
||||
if (leftc | cvn!=1)
|
||||
goto nocv;
|
||||
}
|
||||
if (cvn =& 077) {
|
||||
if (cvn==077) {
|
||||
illcv:
|
||||
error("Illegal conversion");
|
||||
goto nocv;
|
||||
}
|
||||
if (cvn>4 & cvn<10) { /* ptr conv */
|
||||
t = 0; /* integer result */
|
||||
cvn = 0;
|
||||
if ((dope&04)!=0) /* relational? */
|
||||
goto nocv;
|
||||
if (op!=41) /* - */
|
||||
goto illcv;
|
||||
pcvn = cvn;
|
||||
goto nocv;
|
||||
}
|
||||
if (leftc) {
|
||||
if ((dope&010) != 0) { /* =op */
|
||||
if (cvn == 1) {
|
||||
leftc = 0;
|
||||
cvn = 8;
|
||||
t = t1;
|
||||
goto rcvt;
|
||||
} else
|
||||
goto illcv;
|
||||
}
|
||||
d1 = (p1=convert(p1, t, d1, cvn, plength(p2)))[2];
|
||||
} else {
|
||||
rcvt:
|
||||
d2 = (p2=convert(p2, t, d2, cvn, plength(p1)))[2];
|
||||
}
|
||||
nocv:; }
|
||||
if (d1==d2)
|
||||
d = d1+1; else
|
||||
d = max(d1,d2);
|
||||
if ((dope&04)!=0) { /* relational? */
|
||||
if (op>61 & t>=010)
|
||||
op =+ 4; /* ptr relation */
|
||||
t = 0; /* relational is integer */
|
||||
}
|
||||
*cp++ = optim(block(2,op,t,d,p1,p2));
|
||||
if (pcvn) {
|
||||
p1 = *--cp;
|
||||
*cp++ = block(1,50+pcvn,0,d,p1);
|
||||
}
|
||||
return;
|
||||
*cp++ = block(1,op,t1,d1==0?1:d1,p1);
|
||||
}
|
||||
|
||||
setype(p, t)
|
||||
int p[];
|
||||
{
|
||||
int p1[];
|
||||
|
||||
if ((p[1]&07) != 4) /* not structure */
|
||||
return;
|
||||
p[1] = t;
|
||||
switch(*p) {
|
||||
|
||||
case 29: /* & */
|
||||
case 35:
|
||||
setype(p[3], decref(t));
|
||||
return;
|
||||
|
||||
case 36: /* * */
|
||||
setype(p[3], incref(t));
|
||||
return;
|
||||
|
||||
case 40: /* + */
|
||||
setype(p[4], t);
|
||||
}
|
||||
}
|
||||
|
||||
chkfun(p)
|
||||
int p[];
|
||||
{
|
||||
if ((p[1]&030)==020) /* func */
|
||||
error("Illegal use of function");
|
||||
}
|
||||
|
||||
optim(p)
|
||||
int p[];
|
||||
{
|
||||
int p1[], p2[], t;
|
||||
|
||||
if (*p != 40) /* + */
|
||||
return(p);
|
||||
p1 = p[3];
|
||||
p2 = p[4];
|
||||
if (*p1==21) { /* const */
|
||||
t = p1;
|
||||
p1 = p2;
|
||||
p2 = t;
|
||||
}
|
||||
if (*p2 != 21) /* const */
|
||||
return(p);
|
||||
if ((t=p2[3]) == 0) /* const 0 */
|
||||
return(p1);
|
||||
if (*p1!=35 & *p1!=29) /* not & */
|
||||
return(p);
|
||||
p2 = p1[3];
|
||||
if (*p2!=20) { /* name? */
|
||||
error("C error (optim)");
|
||||
return(p);
|
||||
}
|
||||
p2[4] =+ t;
|
||||
return(p1);
|
||||
}
|
||||
|
||||
disarray(p)
|
||||
int p[];
|
||||
{
|
||||
extern cp;
|
||||
int t, cp[];
|
||||
|
||||
if (((t = p[1]) & 030)!=030 | p[0]==20&p[3]==4) /* array & not MOS */
|
||||
return(p);
|
||||
p[1] = decref(t);
|
||||
*cp++ = p;
|
||||
build(35); /* add & */
|
||||
return(*--cp);
|
||||
}
|
||||
|
||||
convert(p, t, d, cvn, len)
|
||||
int p[];
|
||||
{
|
||||
int c, p1[];
|
||||
|
||||
if (*p==21) { /* constant */
|
||||
c = p[3];
|
||||
switch(cvn) {
|
||||
|
||||
case 4: /* int -> double[] */
|
||||
c =<< 1;
|
||||
|
||||
case 3: /* int -> float[] */
|
||||
c =<< 1;
|
||||
|
||||
case 2: /* int -> int[] */
|
||||
c =<< 1;
|
||||
p[3] = c;
|
||||
return(p);
|
||||
|
||||
case 10: /* i -> s[] */
|
||||
p[3] = c*len;
|
||||
return(p);
|
||||
}
|
||||
}
|
||||
if (cvn==10) /* i -> s[]; retrun i*len */
|
||||
return(block(2,42,t,d+2,p,block(1,21,0,0,len)));
|
||||
return(block(1, 50+cvn, t, max(1,d), p));
|
||||
}
|
||||
|
||||
chkw(p)
|
||||
int p[]; {
|
||||
extern error;
|
||||
auto t;
|
||||
|
||||
if ((t=p[1])>1 & t<=07)
|
||||
error("Integer operand required");
|
||||
return;
|
||||
}
|
||||
|
||||
lintyp(t)
|
||||
{
|
||||
if (t<=07)
|
||||
return(t);
|
||||
if ((t&037)==t)
|
||||
return((t&07)+5);
|
||||
return(10);
|
||||
}
|
||||
|
||||
error(s, p1, p2, p3, p4, p5, p6) {
|
||||
extern line, fout, nerror;
|
||||
int f;
|
||||
|
||||
nerror++;
|
||||
flush();
|
||||
f = fout;
|
||||
fout = 1;
|
||||
printf("%d: ", line);
|
||||
printf(s, p1, p2, p3, p4, p5, p6);
|
||||
putchar('\n');
|
||||
fout = f;
|
||||
}
|
||||
|
||||
block(n, op, t, d, p1,p2,p3)
|
||||
int p1[],p2[],p3[]; {
|
||||
int p[], ap[], space[];
|
||||
extern space;
|
||||
|
||||
ap = &op;
|
||||
n =+ 3;
|
||||
p = space;
|
||||
while(n--)
|
||||
pblock(*ap++);
|
||||
return(p);
|
||||
}
|
||||
|
||||
pblock(p)
|
||||
{
|
||||
extern space, osleft;
|
||||
int space[];
|
||||
|
||||
*space++ = p;
|
||||
if (--osleft<=0) {
|
||||
error("Expression overflow");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
chklval(p)
|
||||
int p[]; {
|
||||
extern error;
|
||||
|
||||
if (*p!=20 & *p !=36)
|
||||
error("Lvalue required");
|
||||
}
|
||||
|
||||
max(a, b)
|
||||
{
|
||||
if (a>b)
|
||||
return(a);
|
||||
return(b);
|
||||
}
|
||||
|
505
prestruct/c02.c
Normal file
505
prestruct/c02.c
Normal file
@ -0,0 +1,505 @@
|
||||
extdef() {
|
||||
extern eof, cval, defsym;
|
||||
extern csym, strflg, xdflg, peeksym, fcval;
|
||||
int o, c, cs[], type, csym[], width, nel, ninit, defsym[];
|
||||
char s[];
|
||||
float sf;
|
||||
double fcval;
|
||||
|
||||
if(((o=symbol())==0) | o==1) /* EOF */
|
||||
return;
|
||||
type = 0;
|
||||
if (o==19) { /* keyword */
|
||||
if ((type=cval)>4)
|
||||
goto syntax; /* not type */
|
||||
} else {
|
||||
if (o==20)
|
||||
csym[4] =| 0200; /* remember name */
|
||||
peeksym = o;
|
||||
}
|
||||
defsym = 0;
|
||||
xdflg++;
|
||||
tdeclare(type, 0, 0);
|
||||
if (defsym==0)
|
||||
return;
|
||||
*defsym = 6;
|
||||
cs = &defsym[4];
|
||||
printf(".globl %p\n", cs);
|
||||
strflg = 1;
|
||||
xdflg = 0;
|
||||
type = defsym[1];
|
||||
if ((type&030)==020) { /* a function */
|
||||
printf(".text\n%p:\nmov r5,-(sp); mov sp,r5\n", cs);
|
||||
declist(0);
|
||||
strflg = 0;
|
||||
c = 0;
|
||||
if ((peeksym=symbol())!=2) { /* { */
|
||||
blkhed();
|
||||
c++;
|
||||
}
|
||||
statement(1);
|
||||
retseq();
|
||||
if (c)
|
||||
blkend();
|
||||
return;
|
||||
}
|
||||
width = length(defsym);
|
||||
if ((type&030)==030) /* array */
|
||||
width = plength(defsym);
|
||||
nel = defsym[8];
|
||||
ninit = 0;
|
||||
if ((peeksym=symbol()) == 1) { /* ; */
|
||||
printf(".comm %p,%o\n", &defsym[4], nel*width);
|
||||
peeksym = -1;
|
||||
return;
|
||||
}
|
||||
printf(".data\n%p:", &defsym[4]);
|
||||
loop: {
|
||||
ninit++;
|
||||
switch(o=symbol()) {
|
||||
|
||||
case 22: /* string */
|
||||
if (width!=2)
|
||||
bxdec();
|
||||
printf("L%d\n", cval);
|
||||
break;
|
||||
|
||||
case 41: /* - const */
|
||||
if ((o=symbol())==23) { /* float */
|
||||
fcval = -fcval;
|
||||
goto case23;
|
||||
}
|
||||
if (o!=21)
|
||||
goto syntax;
|
||||
cval = -cval;
|
||||
|
||||
case 21: /* const */
|
||||
if (width==1)
|
||||
printf(".byte ");
|
||||
if (width>2) {
|
||||
fcval = cval;
|
||||
goto case23;
|
||||
}
|
||||
printf("%o\n", cval);
|
||||
break;
|
||||
|
||||
case 20: /* name */
|
||||
if (width!=2)
|
||||
bxdec();
|
||||
printf("%p\n", &csym[4]);
|
||||
break;
|
||||
|
||||
case 23:
|
||||
case23:
|
||||
if (width==4) {
|
||||
sf = fcval;
|
||||
printf("%o;%o\n", sf);
|
||||
break;
|
||||
}
|
||||
if (width==8) {
|
||||
printf("%o;%o;%o;%o\n", fcval);
|
||||
break;
|
||||
}
|
||||
bxdec();
|
||||
break;
|
||||
|
||||
default:
|
||||
goto syntax;
|
||||
|
||||
}
|
||||
} if ((o=symbol())==9) goto loop; /* , */
|
||||
if (o==1) { /* ; */
|
||||
done:
|
||||
if (ninit<nel)
|
||||
printf(".=.+%d.\n", (nel-ninit)*width);
|
||||
return;
|
||||
}
|
||||
syntax:
|
||||
error("External definition syntax");
|
||||
errflush(o);
|
||||
statement(0);
|
||||
}
|
||||
|
||||
bxdec()
|
||||
{
|
||||
error("Inconsistent external initialization");
|
||||
}
|
||||
|
||||
statement(d) {
|
||||
extern symbol, error, blkhed, eof, peeksym;
|
||||
extern blkend, csym[], rcexpr, block[], tree[], regtab[];
|
||||
extern retseq, jumpc, jump, label, contlab, brklab, cval;
|
||||
extern swp[], isn, pswitch, peekc;
|
||||
extern efftab[], deflab, errflush, swtab[], swsiz, branch;
|
||||
|
||||
int o, o1, o2, o3, np[];
|
||||
|
||||
stmt:
|
||||
switch(o=symbol()) {
|
||||
|
||||
/* EOF */
|
||||
case 0:
|
||||
error("Unexpected EOF");
|
||||
/* ; */
|
||||
case 1:
|
||||
/* } */
|
||||
case 3:
|
||||
return;
|
||||
|
||||
/* { */
|
||||
case 2: {
|
||||
if(d)
|
||||
blkhed();
|
||||
while (!eof) {
|
||||
if ((o=symbol())==3) /* } */
|
||||
goto bend;
|
||||
peeksym = o;
|
||||
statement(0);
|
||||
}
|
||||
error("Missing '}'");
|
||||
bend:
|
||||
return;
|
||||
}
|
||||
|
||||
/* keyword */
|
||||
case 19:
|
||||
switch(cval) {
|
||||
|
||||
/* goto */
|
||||
case 10:
|
||||
np = tree();
|
||||
if ((np[1]&030)!=030) /* not array */
|
||||
np = block(1, 36, 1, np[2]+1, np);
|
||||
rcexpr(block(1,102,0,0,np), regtab);
|
||||
goto semi;
|
||||
|
||||
/* return */
|
||||
case 11:
|
||||
if((peeksym=symbol())==6) /* ( */
|
||||
rcexpr(block(1,110,0,0,pexpr()), regtab);
|
||||
retseq();
|
||||
goto semi;
|
||||
|
||||
/* if */
|
||||
case 12:
|
||||
jumpc(pexpr(), o1=isn++, 0);
|
||||
statement(0);
|
||||
if ((o=symbol())==19 & cval==14) { /* else */
|
||||
o2 = isn++;
|
||||
(easystmt()?branch:jump)(o2);
|
||||
label(o1);
|
||||
statement(0);
|
||||
label(o2);
|
||||
return;
|
||||
}
|
||||
peeksym = o;
|
||||
label(o1);
|
||||
return;
|
||||
|
||||
/* while */
|
||||
case 13:
|
||||
o1 = contlab;
|
||||
o2 = brklab;
|
||||
label(contlab = isn++);
|
||||
jumpc(pexpr(), brklab=isn++, 0);
|
||||
o3 = easystmt();
|
||||
statement(0);
|
||||
(o3?branch:jump)(contlab);
|
||||
label(brklab);
|
||||
contlab = o1;
|
||||
brklab = o2;
|
||||
return;
|
||||
|
||||
/* break */
|
||||
case 17:
|
||||
if(brklab==0)
|
||||
error("Nothing to break from");
|
||||
jump(brklab);
|
||||
goto semi;
|
||||
|
||||
/* continue */
|
||||
case 18:
|
||||
if(contlab==0)
|
||||
error("Nothing to continue");
|
||||
jump(contlab);
|
||||
goto semi;
|
||||
|
||||
/* do */
|
||||
case 19:
|
||||
o1 = contlab;
|
||||
o2 = brklab;
|
||||
contlab = isn++;
|
||||
brklab = isn++;
|
||||
label(o3 = isn++);
|
||||
statement(0);
|
||||
label(contlab);
|
||||
contlab = o1;
|
||||
if ((o=symbol())==19 & cval==13) { /* while */
|
||||
jumpc(tree(), o3, 1);
|
||||
label(brklab);
|
||||
brklab = o2;
|
||||
goto semi;
|
||||
}
|
||||
goto syntax;
|
||||
|
||||
/* case */
|
||||
case 16:
|
||||
if ((o=symbol())!=21) { /* constant */
|
||||
if (o!=41) /* - */
|
||||
goto syntax;
|
||||
if ((o=symbol())!=21)
|
||||
goto syntax;
|
||||
cval = - cval;
|
||||
}
|
||||
if ((o=symbol())!=8) /* : */
|
||||
goto syntax;
|
||||
if (swp==0) {
|
||||
error("Case not in switch");
|
||||
goto stmt;
|
||||
}
|
||||
if(swp>=swtab+swsiz) {
|
||||
error("Switch table overflow");
|
||||
} else {
|
||||
*swp++ = isn;
|
||||
*swp++ = cval;
|
||||
label(isn++);
|
||||
}
|
||||
goto stmt;
|
||||
|
||||
/* switch */
|
||||
case 15:
|
||||
o1 = brklab;
|
||||
brklab = isn++;
|
||||
np = pexpr();
|
||||
if (np[1]>1 & np[1]<07)
|
||||
error("Integer required");
|
||||
rcexpr(block(1,110,0,0,np), regtab);
|
||||
pswitch();
|
||||
brklab = o1;
|
||||
return;
|
||||
|
||||
/* default */
|
||||
case 20:
|
||||
if (swp==0)
|
||||
error("Default not in switch");
|
||||
if ((o=symbol())!=8) /* : */
|
||||
goto syntax;
|
||||
deflab = isn++;
|
||||
label(deflab);
|
||||
goto stmt;
|
||||
}
|
||||
|
||||
error("Unknown keyword");
|
||||
goto syntax;
|
||||
|
||||
/* name */
|
||||
case 20:
|
||||
if (peekc==':') {
|
||||
peekc = 0;
|
||||
if (csym[0]>0) {
|
||||
error("Redefinition");
|
||||
goto stmt;
|
||||
}
|
||||
csym[0] = 7;
|
||||
csym[1] = 030; /* int[] */
|
||||
if (csym[2]==0)
|
||||
csym[2] = isn++;
|
||||
label(csym[2]);
|
||||
goto stmt;
|
||||
}
|
||||
}
|
||||
|
||||
peeksym = o;
|
||||
rcexpr(tree(), efftab);
|
||||
goto semi;
|
||||
|
||||
semi:
|
||||
if ((o=symbol())!=1) /* ; */
|
||||
goto syntax;
|
||||
return;
|
||||
|
||||
syntax:
|
||||
error("Statement syntax");
|
||||
errflush(o);
|
||||
goto stmt;
|
||||
}
|
||||
|
||||
pexpr()
|
||||
{
|
||||
auto o, t;
|
||||
|
||||
if ((o=symbol())!=6) /* ( */
|
||||
goto syntax;
|
||||
t = tree();
|
||||
if ((o=symbol())!=7) /* ) */
|
||||
goto syntax;
|
||||
return(t);
|
||||
syntax:
|
||||
error("Statement syntax");
|
||||
errflush(o);
|
||||
return(0);
|
||||
}
|
||||
|
||||
pswitch() {
|
||||
extern swp[], isn, swtab[], printf, deflab, statement, brklab;
|
||||
extern label;
|
||||
int sswp[], dl, cv, swlab;
|
||||
|
||||
sswp = swp;
|
||||
if (swp==0)
|
||||
swp = swtab;
|
||||
swlab = isn++;
|
||||
printf("jsr pc,bswitch; l%d\n", swlab);
|
||||
dl = deflab;
|
||||
deflab = 0;
|
||||
statement(0);
|
||||
if (!deflab) {
|
||||
deflab = isn++;
|
||||
label(deflab);
|
||||
}
|
||||
printf("L%d:.data;L%d:", brklab, swlab);
|
||||
while(swp>sswp & swp>swtab) {
|
||||
cv = *--swp;
|
||||
printf("%o; l%d\n", cv, *--swp);
|
||||
}
|
||||
printf("L%d; 0\n.text\n", deflab);
|
||||
deflab = dl;
|
||||
swp = sswp;
|
||||
}
|
||||
|
||||
blkhed()
|
||||
{
|
||||
extern symbol, cval, peeksym, paraml[], parame[];
|
||||
extern error, rlength, setstk, defvec, isn, defstat;
|
||||
extern stack, hshtab[], hshsiz, pssiz;
|
||||
int al, pl, cs[], hl, t[];
|
||||
|
||||
declist(0);
|
||||
stack = al = 0;
|
||||
pl = 4;
|
||||
while(paraml) {
|
||||
*parame = 0;
|
||||
paraml = *(cs = paraml);
|
||||
if (cs[1]==2) /* float args -> double */
|
||||
cs[1] = 3;
|
||||
cs[2] = pl;
|
||||
*cs = 10;
|
||||
if ((cs[1]&030) == 030) /* array */
|
||||
cs[1] =- 020; /* set ref */
|
||||
pl =+ rlength(cs);
|
||||
}
|
||||
cs = hshtab;
|
||||
hl = hshsiz;
|
||||
while(hl--) {
|
||||
if (cs[4]) {
|
||||
if (cs[0]>1 & (cs[1]&07)==05) { /* referred structure */
|
||||
t = cs[3];
|
||||
cs[3] = t[3];
|
||||
cs[1] = cs[1]&077770 | 04;
|
||||
}
|
||||
switch(cs[0]) {
|
||||
|
||||
/* sort unmentioned */
|
||||
case -2:
|
||||
cs[0] = 5; /* auto */
|
||||
|
||||
/* auto */
|
||||
case 5:
|
||||
al =- trlength(cs);
|
||||
cs[2] = al;
|
||||
break;
|
||||
|
||||
/* parameter */
|
||||
case 10:
|
||||
cs[0] = 5;
|
||||
break;
|
||||
|
||||
/* static */
|
||||
case 7:
|
||||
cs[2] = isn;
|
||||
printf(".bss; L%d: .=.+%o; .text\n",
|
||||
isn++, trlength(cs));
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
cs = cs+pssiz;
|
||||
}
|
||||
setstk(al);
|
||||
}
|
||||
|
||||
blkend() {
|
||||
extern hshtab[], hshsiz, pssiz, hshused, debug;
|
||||
auto i, hl;
|
||||
|
||||
i = 0;
|
||||
hl = hshsiz;
|
||||
while(hl--) {
|
||||
if(hshtab[i+4]) {
|
||||
if (debug)
|
||||
if (hshtab[i]!=1)
|
||||
error("%p %o %o %o %o %o",
|
||||
&hshtab[i+4],
|
||||
hshtab[i],
|
||||
hshtab[i+1],
|
||||
hshtab[i+2],
|
||||
hshtab[i+3],
|
||||
hshtab[i+8]);
|
||||
if (hshtab[i]==0)
|
||||
error("%p undefined", &hshtab[i+4]);
|
||||
if((hshtab[i+4]&0200)==0) { /* not top-level */
|
||||
hshtab[i+4] = 0;
|
||||
hshused--;
|
||||
}
|
||||
}
|
||||
i =+ pssiz;
|
||||
}
|
||||
}
|
||||
|
||||
errflush(o) {
|
||||
extern symbol, peeksym, eof;
|
||||
|
||||
while(o>3) /* ; { } */
|
||||
o = symbol();
|
||||
peeksym = o;
|
||||
}
|
||||
|
||||
declist(mosflg)
|
||||
{
|
||||
extern peeksym, csym[], cval;
|
||||
auto o, offset;
|
||||
|
||||
offset = 0;
|
||||
while((o=symbol())==19 & cval<10)
|
||||
if (cval<=4)
|
||||
offset = tdeclare(cval, offset, mosflg);
|
||||
else
|
||||
scdeclare(cval);
|
||||
peeksym = o;
|
||||
return(offset);
|
||||
}
|
||||
|
||||
easystmt()
|
||||
{
|
||||
extern peeksym, peekc, cval;
|
||||
|
||||
if((peeksym=symbol())==20) /* name */
|
||||
return(peekc!=':'); /* not label */
|
||||
if (peeksym==19) { /* keyword */
|
||||
switch(cval)
|
||||
|
||||
case 10: /* goto */
|
||||
case 11: /* return */
|
||||
case 17: /* break */
|
||||
case 18: /* continue */
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
return(peeksym!=2); /* { */
|
||||
}
|
||||
|
||||
branch(lab)
|
||||
{
|
||||
printf("br L%d\n", lab);
|
||||
}
|
||||
|
251
prestruct/c03.c
Normal file
251
prestruct/c03.c
Normal file
@ -0,0 +1,251 @@
|
||||
retseq()
|
||||
{
|
||||
printf("jmp retrn\n");
|
||||
}
|
||||
|
||||
decref(t)
|
||||
{
|
||||
|
||||
if ((t & 077770) == 0) {
|
||||
error("Illegal indirection");
|
||||
return(t);
|
||||
}
|
||||
return((t>>2) & 077770 | t&07);
|
||||
}
|
||||
|
||||
incref(t)
|
||||
{
|
||||
return((t<<2)&077740 | (t&07) | 010);
|
||||
}
|
||||
|
||||
jumpc(tree, lbl, cond)
|
||||
int tree[];
|
||||
{
|
||||
extern cctab, block, rcexpr;
|
||||
|
||||
rcexpr(block(1,easystmt()+103,tree,lbl,cond),cctab);
|
||||
}
|
||||
|
||||
rcexpr(tree, table)
|
||||
int tree[], table;
|
||||
{
|
||||
extern space, putwrd, putchar, line;
|
||||
int c, sp[];
|
||||
|
||||
if (tree == 0)
|
||||
return;
|
||||
putchar('#');
|
||||
c = space;
|
||||
c =/ 2; /* # addresses per word */
|
||||
sp = 0;
|
||||
putwrd(c);
|
||||
putwrd(tree);
|
||||
putwrd(table);
|
||||
putwrd(line);
|
||||
while(c--)
|
||||
putwrd(*sp++);
|
||||
}
|
||||
|
||||
jump(lab) {
|
||||
extern printf;
|
||||
|
||||
printf("jmp\tl%d\n", lab);
|
||||
}
|
||||
|
||||
label(l) {
|
||||
extern printf;
|
||||
|
||||
printf("L%d:", l);
|
||||
}
|
||||
|
||||
setstk(a) {
|
||||
extern printf, stack;
|
||||
auto ts;
|
||||
|
||||
ts = a-stack;
|
||||
stack = a;
|
||||
switch(ts) {
|
||||
|
||||
case 0:
|
||||
return;
|
||||
|
||||
case 0177776: /* -2 */
|
||||
printf("tst -(sp)\n");
|
||||
return;
|
||||
|
||||
case 0177774: /* -4 */
|
||||
printf("cmp -(sp),-(sp)\n");
|
||||
return;
|
||||
}
|
||||
printf("add $%o,sp\n", ts);
|
||||
}
|
||||
|
||||
plength(p)
|
||||
int p[];
|
||||
{
|
||||
int t, l;
|
||||
|
||||
if (((t=p[1])&077770) == 0) /* not a reference */
|
||||
return(1);
|
||||
p[1] = decref(t);
|
||||
l = length(p);
|
||||
p[1] = t;
|
||||
return(l);
|
||||
}
|
||||
|
||||
length(cs)
|
||||
int cs[];
|
||||
{
|
||||
extern hshtab[];
|
||||
int t;
|
||||
|
||||
t = cs[1];
|
||||
if ((t&030) == 030) /* array */
|
||||
t = decref(t);
|
||||
if (t>=010)
|
||||
return(2);
|
||||
switch(t&07) {
|
||||
|
||||
case 0: /* int */
|
||||
return(2);
|
||||
|
||||
case 1: /* char */
|
||||
return(1);
|
||||
|
||||
case 2: /* float */
|
||||
return(4);
|
||||
|
||||
case 3: /* double */
|
||||
return(8);
|
||||
|
||||
case 4: /* structure */
|
||||
if (cs>=hshtab) /* in namelist */
|
||||
return(cs[3]);
|
||||
return(getlen(cs));
|
||||
|
||||
case 5:
|
||||
error("Bad structure");
|
||||
return(0);
|
||||
}
|
||||
error("Compiler error (length)");
|
||||
}
|
||||
|
||||
getlen(p)
|
||||
int p[];
|
||||
{
|
||||
int p1[];
|
||||
|
||||
switch(*p) {
|
||||
|
||||
case 20: /* name */
|
||||
return(p[2]);
|
||||
|
||||
case 35:
|
||||
case 29: /* & */
|
||||
case 36: /* * */
|
||||
case 100: /* call */
|
||||
case 41: /* - */
|
||||
return(getlen(p[3]));
|
||||
|
||||
case 40: /* + */
|
||||
p1 = p[4];
|
||||
if ((p1[1]&07) == 04)
|
||||
return(getlen(p1));
|
||||
return(getlen(p[3]));
|
||||
}
|
||||
error("Unimplemented pointer conversion");
|
||||
return(0);
|
||||
}
|
||||
|
||||
rlength(cs)
|
||||
int cs[];
|
||||
{
|
||||
auto l;
|
||||
|
||||
if (((l=length(cs))&01) != 0)
|
||||
l++;
|
||||
return(l);
|
||||
}
|
||||
|
||||
tlength(cs)
|
||||
int cs[];
|
||||
{
|
||||
int nel;
|
||||
|
||||
if ((nel = cs[8]) == 0)
|
||||
nel = 1;
|
||||
return(length(cs)*nel);
|
||||
}
|
||||
|
||||
trlength(cs)
|
||||
int cs[];
|
||||
{
|
||||
int l;
|
||||
|
||||
if (((l=tlength(cs))&01) != 0)
|
||||
l++;
|
||||
return(l);
|
||||
}
|
||||
|
||||
printn(n,b) {
|
||||
extern putchar;
|
||||
auto a;
|
||||
|
||||
if(a=n/b) /* assignment, not test for equality */
|
||||
printn(a, b); /* recursive */
|
||||
putchar(n%b + '0');
|
||||
}
|
||||
|
||||
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
|
||||
char fmt[]; {
|
||||
extern printn, putchar, namsiz, ncpw;
|
||||
char s[];
|
||||
auto adx[], x, c, i[];
|
||||
|
||||
adx = &x1; /* argument pointer */
|
||||
loop:
|
||||
while((c = *fmt++) != '%') {
|
||||
if(c == '\0')
|
||||
return;
|
||||
putchar(c);
|
||||
}
|
||||
x = *adx++;
|
||||
switch (c = *fmt++) {
|
||||
|
||||
case 'd': /* decimal */
|
||||
case 'o': /* octal */
|
||||
if(x < 0) {
|
||||
x = -x;
|
||||
if(x<0) { /* - infinity */
|
||||
if(c=='o')
|
||||
printf("100000");
|
||||
else
|
||||
printf("-32767");
|
||||
goto loop;
|
||||
}
|
||||
putchar('-');
|
||||
}
|
||||
printn(x, c=='o'?8:10);
|
||||
goto loop;
|
||||
|
||||
case 's': /* string */
|
||||
s = x;
|
||||
while(c = *s++)
|
||||
putchar(c);
|
||||
goto loop;
|
||||
|
||||
case 'p':
|
||||
s = x;
|
||||
putchar('_');
|
||||
c = namsiz;
|
||||
while(c--)
|
||||
if (*s)
|
||||
putchar((*s++)&0177);
|
||||
goto loop;
|
||||
}
|
||||
putchar('%');
|
||||
fmt--;
|
||||
adx--;
|
||||
goto loop;
|
||||
}
|
||||
|
588
prestruct/c10.c
Normal file
588
prestruct/c10.c
Normal file
@ -0,0 +1,588 @@
|
||||
/*
|
||||
|
||||
C compiler, part 2
|
||||
|
||||
Copyright 1972 Bell Telephone Laboratories, Inc.
|
||||
|
||||
*/
|
||||
|
||||
waste() /* waste space */
|
||||
{
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
waste(waste(waste),waste(waste),waste(waste));
|
||||
}
|
||||
main(argc, argv)
|
||||
char argv[][];
|
||||
{
|
||||
extern fout, fin, nerror, line;
|
||||
extern getwrd, rcexpr, tmpfil;
|
||||
extern cctab[], regtab[], efftab[], sptab[];
|
||||
int sp[], c, table[], tabtab[3][], tree;
|
||||
|
||||
if (argc<4) {
|
||||
error("Arg count");
|
||||
exit(1);
|
||||
}
|
||||
if((fin=open(argv[1],0))<0) {
|
||||
error("Cant't find %s", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if((fout=creat(argv[3],017))<0) {
|
||||
error("Can't create %s", argv[3]);
|
||||
exit(1);
|
||||
}
|
||||
tmpfil = argv[2];
|
||||
|
||||
tabtab[0] = regtab;
|
||||
tabtab[1] = efftab;
|
||||
tabtab[2] = cctab;
|
||||
tabtab[3] = sptab;
|
||||
while(c=getchar()) {
|
||||
if(c=='#') {
|
||||
sp = 0;
|
||||
c = getwrd();
|
||||
tree = getwrd();
|
||||
table = tabtab[getwrd()];
|
||||
line = getwrd();
|
||||
while(c--)
|
||||
*sp++ = getwrd();
|
||||
rcexpr(tree, table, 0);
|
||||
} else
|
||||
putchar(c);
|
||||
}
|
||||
flush();
|
||||
exit(nerror!=0);
|
||||
}
|
||||
|
||||
match(tree, table, nreg)
|
||||
int tree[], table[]; {
|
||||
extern opdope[], cctab, maprel;
|
||||
int op, d1, d2, t1, t2, p1[], p2[], dope, cctab[];
|
||||
int maprel[];
|
||||
char mp[];
|
||||
|
||||
if (tree==0)
|
||||
return(0);
|
||||
op = *tree;
|
||||
if (op>=29) /* if not leaf */
|
||||
p1 = tree[3];
|
||||
else
|
||||
p1 = tree;
|
||||
t1 = p1[1];
|
||||
d1 = dcalc(p1, nreg);
|
||||
if (((dope=opdope[op])&01)!=0) { /* binary? */
|
||||
p2 = tree[4];
|
||||
t2 = p2[1];
|
||||
d2 = dcalc(p2, nreg);
|
||||
if (d2>d1 & (dope&0100)!=0) /* commute? */
|
||||
if (table!=cctab | (op!=47&op!=48)) { /* commute? */
|
||||
if ((dope&04)!=0) /* relation? */
|
||||
*tree = op = maprel[op-60];
|
||||
dope = t1;
|
||||
t1 = t2;
|
||||
t2 = dope;
|
||||
dope = p1;
|
||||
tree[3] = p1 = p2;
|
||||
tree[4] = p2 = dope;
|
||||
dope = d1;
|
||||
d1 = d2;
|
||||
d2 = dope;
|
||||
dope = t1;
|
||||
t1 = t2;
|
||||
t2 = dope;
|
||||
}
|
||||
}
|
||||
while(*table) {
|
||||
if (*table++ == op) goto foundop;
|
||||
table++;
|
||||
}
|
||||
return(0);
|
||||
foundop:
|
||||
table = *table;
|
||||
nxtry:
|
||||
mp = table;
|
||||
if (*mp == 0)
|
||||
return(0);
|
||||
if (d1 > (*mp&077) | (*mp>=0100)&(*p1!=36))
|
||||
goto notyet;
|
||||
if (notcompat(t1, mp[1]))
|
||||
goto notyet;
|
||||
if ((opdope[op]&01)!=0 & p2!=0) {
|
||||
if (d2 > (mp[2]&077) | (mp[2]>=0100)&(*p2!=36))
|
||||
goto notyet;
|
||||
if (notcompat(t2,mp[3]))
|
||||
goto notyet;
|
||||
}
|
||||
now:
|
||||
return(table[2]);
|
||||
notyet:
|
||||
table = table+3;
|
||||
goto nxtry;
|
||||
}
|
||||
|
||||
rcexpr(tree, table, reg)
|
||||
int tree[]; {
|
||||
extern cexpr, regtab, cctab, sptab, printf, error;
|
||||
extern jumpc, cbranch;
|
||||
int r, modf;
|
||||
|
||||
if(tree==0)
|
||||
return(0);
|
||||
if(*tree == 103 | *tree==104) {
|
||||
(*tree==103?jumpc:cbranch)(tree[1],tree[2],tree[3],0);
|
||||
return(0);
|
||||
}
|
||||
modf = isfloat(tree)? 'f':0;
|
||||
if (*tree == 110) { /* force r0 */
|
||||
if((r=rcexpr(tree[3], table, reg)) != 0)
|
||||
printf("mov%c r%d,r0\n", modf, r);
|
||||
return(0);
|
||||
}
|
||||
if ((r=cexpr(tree, table, reg))>=0)
|
||||
return(r);
|
||||
if (table!=regtab)
|
||||
if((r=cexpr(tree, regtab, reg))>=0) {
|
||||
if (table==sptab)
|
||||
printf("mov%c r%d,-(sp)\n", modf, r);
|
||||
if (table==cctab) {
|
||||
if (modf=='f')
|
||||
printf("cfcc\n");
|
||||
printf("tst%c r%d\n", modf, r);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
error("No match for op %d", *tree);
|
||||
}
|
||||
|
||||
cexpr(tree, table, reg)
|
||||
int tree[][], table[]; {
|
||||
extern match, nreg, printf, pname, putchar, regtab;
|
||||
extern sptab, cctab, rcexpr, prins, rlength, popstk;
|
||||
extern collcon, isn, label, branch, cbranch;
|
||||
extern maprel[];
|
||||
int p1[], p2[], c, r, p[], otable[], ctable[], regtab[], cctab[];
|
||||
int sptab[];
|
||||
char string[], match[];
|
||||
int reg1, rreg;
|
||||
|
||||
if ((c = *tree)==100) { /* call */
|
||||
p1 = tree[3];
|
||||
p2 = tree[4];
|
||||
r = 0;
|
||||
if(*p2) {
|
||||
while (*p2==9) { /* comma */
|
||||
rcexpr(p2[4], sptab, 0);
|
||||
r =+ arlength((p=p2[4])[1]);
|
||||
p2 = p2[3];
|
||||
}
|
||||
rcexpr(p2, sptab, 0);
|
||||
r =+ arlength(p2[1]);
|
||||
}
|
||||
*tree = 101;
|
||||
tree[2] = r; /* save arg length */
|
||||
}
|
||||
if(c==90) { /* ? */
|
||||
cbranch(tree[3], c=isn++, 0, reg);
|
||||
rcexpr(tree[4][3], table, reg);
|
||||
branch(r=isn++, 0);
|
||||
label(c);
|
||||
reg = rcexpr(tree[4][4], table, reg);
|
||||
label(r);
|
||||
goto retrn;
|
||||
}
|
||||
reg = oddreg(tree, reg);
|
||||
reg1 = reg+1;
|
||||
if ((string=match(tree, table, nreg-reg))==0)
|
||||
return(-1);
|
||||
p1 = tree[3];
|
||||
p2 = tree[4];
|
||||
loop:
|
||||
switch(c = *string++) {
|
||||
|
||||
case '\0':
|
||||
p = tree;
|
||||
if (*p==101) {
|
||||
if (p[2]>0)
|
||||
popstk(p[2]);
|
||||
reg = 0;
|
||||
}
|
||||
retrn:
|
||||
c = isfloat(tree);
|
||||
if (table==cctab & c)
|
||||
printf("cfcc\n");
|
||||
if (!c)
|
||||
if ((c = *tree)==43 | c==73)
|
||||
reg--;
|
||||
return(reg);
|
||||
|
||||
/* A1 */
|
||||
case 'A':
|
||||
p = tree[3];
|
||||
goto adr;
|
||||
|
||||
/* A2 */
|
||||
case 'B':
|
||||
p = tree[4];
|
||||
goto adr;
|
||||
|
||||
/* A */
|
||||
case 'O':
|
||||
p = tree;
|
||||
adr:
|
||||
pname(p);
|
||||
goto loop;
|
||||
|
||||
/* I */
|
||||
case 'M':
|
||||
if ((c = *string)=='\'')
|
||||
string++; else
|
||||
c = 0;
|
||||
prins(*tree, c);
|
||||
goto loop;
|
||||
|
||||
/* B1 */
|
||||
case 'C':
|
||||
if ((c = *tree)<28)
|
||||
p = tree;
|
||||
else
|
||||
p = tree[3];
|
||||
goto pbyte;
|
||||
|
||||
/* BF */
|
||||
case 'P':
|
||||
p = tree;
|
||||
goto pb1;
|
||||
|
||||
/* B2 */
|
||||
case 'D':
|
||||
p = tree[4];
|
||||
pbyte:
|
||||
if (p[1]==1) /* char type? */
|
||||
putchar('b');
|
||||
pb1:
|
||||
if (isfloat(p))
|
||||
putchar('f');
|
||||
goto loop;
|
||||
|
||||
/* BE */
|
||||
case 'L':
|
||||
if (tree[3][1]==1 | tree[4][1]==1)
|
||||
putchar('b');
|
||||
p = tree;
|
||||
goto pb1;
|
||||
|
||||
/* C1 */
|
||||
case 'E':
|
||||
p = p1[3];
|
||||
goto const;
|
||||
|
||||
/* C2 */
|
||||
case 'F':
|
||||
p = p2[3];
|
||||
const:
|
||||
printf("%o", p);
|
||||
goto loop;
|
||||
|
||||
/* F */
|
||||
case 'G':
|
||||
p = p1;
|
||||
goto subtre;
|
||||
|
||||
/* S */
|
||||
case 'K':
|
||||
p = p2;
|
||||
goto subtre;
|
||||
|
||||
/* H */
|
||||
case 'H':
|
||||
p = tree;
|
||||
|
||||
subtre:
|
||||
ctable = regtab;
|
||||
r = reg;
|
||||
c = *string++ - 'A';
|
||||
if ((c&02)!=0)
|
||||
ctable = sptab;
|
||||
if ((c&04)!=0)
|
||||
ctable = cctab;
|
||||
if((c&010)!=0)
|
||||
r = reg1;
|
||||
if((c&01)!=0)
|
||||
if(*p==36) {
|
||||
p = p[3];
|
||||
if(collcon(p) & ctable!=sptab)
|
||||
p = p[3];
|
||||
}
|
||||
rreg = rcexpr(p, ctable, r);
|
||||
if (rreg==r | ctable!=regtab)
|
||||
goto loop;
|
||||
if (string[-2]=='G') /* left operand */
|
||||
if (oddreg(tree, 0)==1) {
|
||||
printf("mov r%d,r%d\n", rreg, r);
|
||||
goto loop;
|
||||
}
|
||||
if (r==reg) {
|
||||
reg = rreg;
|
||||
reg1 = rreg+1;
|
||||
} else
|
||||
reg1 = rreg;
|
||||
goto loop;
|
||||
|
||||
/* R */
|
||||
case 'I':
|
||||
r = reg;
|
||||
if (*string=='-') {
|
||||
string++;
|
||||
r--;
|
||||
}
|
||||
goto preg;
|
||||
|
||||
/* R1 */
|
||||
case 'J':
|
||||
r = reg1;
|
||||
preg:
|
||||
if (r>=5)
|
||||
error("Register overflow: simplify expression");
|
||||
printf("r%d", r);
|
||||
goto loop;
|
||||
|
||||
case '#':
|
||||
p = p1[3];
|
||||
goto nmbr;
|
||||
|
||||
case '"':
|
||||
p = p2[3];
|
||||
goto nmbr;
|
||||
|
||||
case '~':
|
||||
p = tree[3];
|
||||
|
||||
nmbr:
|
||||
if(collcon(p)) {
|
||||
if (*p==41) /* - */
|
||||
putchar('-');
|
||||
switch (*(p = p[4])) {
|
||||
|
||||
case 21: /* number */
|
||||
if (p[3])
|
||||
printf("%d.", p[3]);
|
||||
break;
|
||||
|
||||
case 35: /* & name */
|
||||
pname(p[3]);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
goto loop;
|
||||
|
||||
/* V */
|
||||
case 'V':
|
||||
tree[0] = maprel[(c=tree[0])-60];
|
||||
goto loop;
|
||||
|
||||
/* Z */
|
||||
case 'Z':
|
||||
printf("$%o", p1[5]+p1[4]);
|
||||
goto loop;
|
||||
|
||||
case '^': /* for ++ -- */
|
||||
printf("%o", tree[4]);
|
||||
goto loop;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
pname(p)
|
||||
int p[][]; {
|
||||
char np[];
|
||||
int i;
|
||||
|
||||
loop:
|
||||
switch(*p) {
|
||||
|
||||
case 21: /* const */
|
||||
printf("$%o", p[3]);
|
||||
return;
|
||||
|
||||
case 23: /* float const */
|
||||
printf("L%d", p[3]);
|
||||
return;
|
||||
|
||||
casename:
|
||||
case 20: /* name */
|
||||
if (i=p[4])
|
||||
printf("%d.+", i);
|
||||
switch(p[3]) {
|
||||
|
||||
case 5: /* auto, param */
|
||||
printf("%d.(r5)", p[5]);
|
||||
return;
|
||||
|
||||
/* extern */
|
||||
case 6:
|
||||
printf("%p", &p[5]);
|
||||
return;
|
||||
|
||||
case 4:
|
||||
error("Illegal structure reference");
|
||||
printf("$0");
|
||||
return;
|
||||
|
||||
}
|
||||
printf("L%d", p[5]);
|
||||
return;
|
||||
|
||||
case 35: /* & */
|
||||
putchar('$');
|
||||
p = p[3];
|
||||
goto loop;
|
||||
|
||||
case 36: /* * */
|
||||
putchar('*');
|
||||
p = p[3];
|
||||
goto loop;
|
||||
|
||||
}
|
||||
error("pname called illegally");
|
||||
}
|
||||
|
||||
dcalc(p, nreg)
|
||||
int p[]; {
|
||||
int op, t, p1[], p2[];
|
||||
|
||||
if (p==0)
|
||||
return(0);
|
||||
op = *p;
|
||||
switch (op) {
|
||||
|
||||
case 20: /* name */
|
||||
case 35: /* & (non-automatic) */
|
||||
return(12);
|
||||
|
||||
case 21: /* short constant */
|
||||
return(p[3]==0? 4:8);
|
||||
|
||||
case 23: /* float const */
|
||||
return(p[3]==0? 4:12);
|
||||
|
||||
case 36: /* * */
|
||||
p1 = p[3];
|
||||
if (*p1==20) /* name or offset name */
|
||||
return(12);
|
||||
}
|
||||
|
||||
def:
|
||||
return(p[2]<=nreg? 20: 24);
|
||||
}
|
||||
|
||||
notcompat(at, st) {
|
||||
|
||||
if (st==0) /* word, byte */
|
||||
return(at>1 & at<=07);
|
||||
if (st==1) /* word */
|
||||
return(at>0 & at<=07);
|
||||
st =- 2;
|
||||
if ((at&077740) != 0)
|
||||
at = 020; /* *int for **stuff */
|
||||
if ((at&077770) != 0)
|
||||
at = at&07 | 020;
|
||||
if (st==2 & at==3)
|
||||
at = 2;
|
||||
return(st != at);
|
||||
}
|
||||
|
||||
prins(op, c) {
|
||||
extern instab[], printf;
|
||||
int insp[];
|
||||
|
||||
insp = instab;
|
||||
while(*insp) {
|
||||
if (*insp++ == op) {
|
||||
if ((c = insp[c!=0])==0)
|
||||
goto err;
|
||||
printf("%s", c);
|
||||
return;
|
||||
} else
|
||||
insp = insp + 2;
|
||||
}
|
||||
err:
|
||||
error("No match' for op %d", op);
|
||||
}
|
||||
|
||||
collcon(p)
|
||||
int p[]; {
|
||||
int p1[], t[];
|
||||
|
||||
if(*p==40 | *p==41) {
|
||||
if(*(p1=p[4])==21) { /* number */
|
||||
return(1);
|
||||
}
|
||||
if (*p1==35)
|
||||
return(1);
|
||||
if (*(p1=p[3])==35) {
|
||||
p1 = p[3];
|
||||
p[3] = p[4];
|
||||
p[4] = p1;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
isfloat(t)
|
||||
int t[];
|
||||
{
|
||||
extern opdope[];
|
||||
int rt;
|
||||
|
||||
if ((opdope[t[0]]&04)!=0) /* relational */
|
||||
t = t[3];
|
||||
if ((rt=t[1])>=2 & rt<=3)
|
||||
return(rt);
|
||||
return(0);
|
||||
}
|
||||
|
||||
nreg 3;
|
||||
isn 10000;
|
||||
namsiz 8;
|
||||
line;
|
||||
tmpfil;
|
||||
nerror;
|
||||
|
||||
oddreg(t, reg)
|
||||
int t[];
|
||||
{
|
||||
if (!isfloat(t))
|
||||
switch(*t) {
|
||||
case 43: /* / */
|
||||
case 44: /* % */
|
||||
case 73: /* =/ */
|
||||
case 74: /* =% */
|
||||
reg++;
|
||||
|
||||
case 42: /* * */
|
||||
case 72: /* =* */
|
||||
return(reg|1);
|
||||
}
|
||||
return(reg);
|
||||
}
|
||||
|
||||
arlength(t)
|
||||
{
|
||||
int arl;
|
||||
|
||||
if ((arl=rlength(t)) == 4)
|
||||
return(8);
|
||||
return(arl);
|
||||
}
|
||||
|
||||
maprel[] 60, 61, 64, 65, 62, 63, 68, 69, 66, 67;
|
||||
|
261
prestruct/c11.c
Normal file
261
prestruct/c11.c
Normal file
@ -0,0 +1,261 @@
|
||||
jumpc(tree, lbl, cond)
|
||||
int tree[]; {
|
||||
extern jump, cctab[], rcexpr, isn, label, branch, cbranch;
|
||||
int l1, l2;
|
||||
|
||||
if (tree==0)
|
||||
return;
|
||||
switch(*tree) {
|
||||
|
||||
/* & */
|
||||
case 47:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 0, 0);
|
||||
cbranch(tree[4], l1, 0, 0);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 0, 0);
|
||||
cbranch(tree[4], l2=isn++, 1, 0);
|
||||
label(l1);
|
||||
jump(lbl);
|
||||
label(l2);
|
||||
}
|
||||
return;
|
||||
|
||||
/* | */
|
||||
case 48:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 1, 0);
|
||||
cbranch(tree[4], l2=isn++, 0, 0);
|
||||
label(l1);
|
||||
jump(lbl);
|
||||
label(l2);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 1, 0);
|
||||
cbranch(tree[4], l1, 1, 0);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
}
|
||||
return;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
jumpc(tree[3], lbl, !cond);
|
||||
return;
|
||||
}
|
||||
rcexpr(tree, cctab, 0);
|
||||
branch(l1=isn++, *tree, cond);
|
||||
jump(lbl);
|
||||
label(l1);
|
||||
return;
|
||||
}
|
||||
|
||||
cbranch(tree, lbl, cond, reg)
|
||||
int tree[]; {
|
||||
extern branch, cctab[], rcexpr, isn, label;
|
||||
int l1;
|
||||
|
||||
if (tree==0)
|
||||
return;
|
||||
switch(*tree) {
|
||||
|
||||
/* & */
|
||||
case 47:
|
||||
if (cond) {
|
||||
cbranch(tree[3], l1=isn++, 0, reg);
|
||||
cbranch(tree[4], lbl, 1, reg);
|
||||
label(l1);
|
||||
} else {
|
||||
cbranch(tree[3], lbl, 0, reg);
|
||||
cbranch(tree[4], lbl, 0, reg);
|
||||
}
|
||||
return;
|
||||
|
||||
/* | */
|
||||
case 48:
|
||||
if (cond) {
|
||||
cbranch(tree[3], lbl, 1, reg);
|
||||
cbranch(tree[4], lbl, 1, reg);
|
||||
} else {
|
||||
cbranch(tree[3], l1=isn++, 1, reg);
|
||||
cbranch(tree[4], lbl, 0, reg);
|
||||
label(l1);
|
||||
}
|
||||
return;
|
||||
|
||||
/* ! */
|
||||
case 34:
|
||||
cbranch(tree[3], lbl, !cond, reg);
|
||||
return;
|
||||
}
|
||||
rcexpr(tree, cctab, reg);
|
||||
branch(lbl, *tree, !cond);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
branch(lbl, op, c) {
|
||||
extern printf, prins, opdope[];
|
||||
|
||||
if(op) {
|
||||
if((opdope[op]&04)==0)
|
||||
op = 61;
|
||||
prins(op,c);
|
||||
} else
|
||||
printf("br");
|
||||
printf("\tl%d\n", lbl);
|
||||
}
|
||||
|
||||
jump(lab) {
|
||||
extern printf;
|
||||
|
||||
printf("jmp\tl%d\n", lab);
|
||||
}
|
||||
|
||||
label(l) {
|
||||
extern printf;
|
||||
|
||||
printf("l%d:", l);
|
||||
}
|
||||
|
||||
|
||||
popstk(a) {
|
||||
extern printf;
|
||||
|
||||
switch(a) {
|
||||
|
||||
case 0:
|
||||
return;
|
||||
|
||||
case 2:
|
||||
printf("tst (sp)+\n");
|
||||
return;
|
||||
|
||||
case 4:
|
||||
printf("cmp (sp)+,(sp)+\n");
|
||||
return;
|
||||
}
|
||||
printf("add $%o,sp\n", a);
|
||||
}
|
||||
|
||||
length(t) {
|
||||
|
||||
if (t>=010)
|
||||
return(2);
|
||||
switch(t) {
|
||||
|
||||
case 0:
|
||||
return(2);
|
||||
|
||||
case 1:
|
||||
return(1);
|
||||
|
||||
case 2:
|
||||
return(4);
|
||||
|
||||
case 3:
|
||||
return(8);
|
||||
|
||||
case 4:
|
||||
return(4);
|
||||
|
||||
}
|
||||
return(1024);
|
||||
}
|
||||
|
||||
rlength(c) {
|
||||
extern length;
|
||||
auto l;
|
||||
|
||||
return((l=length(c))==1? 2: l);
|
||||
}
|
||||
|
||||
printd(n) {
|
||||
int a;
|
||||
|
||||
if(a=n/10)
|
||||
printd(a);
|
||||
putchar(n%10 + '0');
|
||||
}
|
||||
|
||||
printo(n)
|
||||
{
|
||||
int a;
|
||||
if (a = (n>>3) & 017777)
|
||||
printo(a);
|
||||
putchar((n&07) + '0');
|
||||
}
|
||||
|
||||
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
|
||||
char fmt[]; {
|
||||
extern namsiz, ncpw;
|
||||
char s[];
|
||||
auto adx[], x, c, i[];
|
||||
|
||||
adx = &x1; /* argument pointer */
|
||||
loop:
|
||||
while((c = *fmt++) != '%') {
|
||||
if(c == '\0')
|
||||
return;
|
||||
putchar(c);
|
||||
}
|
||||
x = *adx++;
|
||||
switch (c = *fmt++) {
|
||||
|
||||
case 'o':
|
||||
printo(x);
|
||||
goto loop;
|
||||
|
||||
case 'd': /* decimal */
|
||||
if(x < 0) {
|
||||
x = -x;
|
||||
if(x<0) { /* - infinity */
|
||||
printf("-32768");
|
||||
goto loop;
|
||||
}
|
||||
putchar('-');
|
||||
}
|
||||
printd(x);
|
||||
goto loop;
|
||||
|
||||
case 'c':
|
||||
if (x)
|
||||
putchar(x);
|
||||
goto loop;
|
||||
|
||||
case 's': /* string */
|
||||
s = x;
|
||||
while(c = *s++)
|
||||
putchar(c);
|
||||
goto loop;
|
||||
|
||||
case 'p':
|
||||
s = x;
|
||||
putchar('_');
|
||||
c = namsiz;
|
||||
while(c--)
|
||||
if(*s)
|
||||
putchar((*s++)&0177);
|
||||
goto loop;
|
||||
}
|
||||
putchar('%');
|
||||
fmt--;
|
||||
adx--;
|
||||
goto loop;
|
||||
}
|
||||
|
||||
error(s, p1, p2) {
|
||||
extern printf, line, fout, flush, putchar, nerror;
|
||||
int f;
|
||||
|
||||
nerror++;
|
||||
flush();
|
||||
f = fout;
|
||||
fout = 1;
|
||||
printf("%d: ", line);
|
||||
printf(s, p1, p2);
|
||||
putchar('\n');
|
||||
fout = f;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user