mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
160 lines
3.3 KiB
C
160 lines
3.3 KiB
C
/*
|
|
Copyright 1982
|
|
Alcyon Corporation
|
|
8716 Production Ave.
|
|
San Diego, Ca. 92121
|
|
*/
|
|
|
|
char *version "@(#) c068 parser 4.0 - Mar 18, 1983";
|
|
/*
|
|
ALCYON C Compiler for the Motorola 68000 - Parser
|
|
|
|
Called from c68:
|
|
|
|
c068 source icode strings
|
|
|
|
source: input source code, preprocessed with comments stripped
|
|
|
|
icode: contains the intermediate code for the code generator,
|
|
for a detailed explanaion see ../doc/icode.
|
|
|
|
strings: contains all the string constants.
|
|
|
|
The basic structure of the parser is as follows:
|
|
|
|
main main driver for parser
|
|
syminit initializes symbol table
|
|
doextdef external definition syntax
|
|
getatt get type attributes
|
|
dlist declaration list for structures/unions
|
|
getatt recursive gettype call
|
|
dodecl do one declaration
|
|
declarator handle declarator syntax
|
|
dodecl do one external declaraion
|
|
initlist external initialization list
|
|
cexpr constant expressions
|
|
expr arithmetic expressions
|
|
maketree build operator tree
|
|
funcbody function body
|
|
dlist declaration list
|
|
stmt function statements
|
|
stmt recursive stmt call
|
|
expr arithmetic expressions
|
|
|
|
*/
|
|
|
|
#include "parser.h"
|
|
|
|
int nextlabel 1;
|
|
int lineno;
|
|
char *exprp &exprarea[0];
|
|
|
|
/*
|
|
* main - main routine for parser
|
|
* Checks arguments, opens input and output files, does main loop
|
|
* for external declarations and blocks.
|
|
*/
|
|
main(argc,argv) /* returns - none*/
|
|
int argc; /* argument count*/
|
|
char *argv[]; /* argument pointers*/
|
|
{
|
|
register char *q;
|
|
register int i;
|
|
|
|
for( i = 4; i < argc; i++ ) {
|
|
q = argv[i];
|
|
if( *q++ != '-' )
|
|
usage();
|
|
while( 1 ) {
|
|
switch( *q++ ) {
|
|
|
|
case 'f':
|
|
fflag++;
|
|
continue;
|
|
|
|
case 'e':
|
|
eflag++;
|
|
continue;
|
|
|
|
case 'w':
|
|
wflag++;
|
|
continue;
|
|
|
|
case '\0':
|
|
break;
|
|
|
|
default:
|
|
usage();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if( argc < 4 )
|
|
usage();
|
|
if( fopen(argv[1],&ibuf,0) < 0 ) /* 3rd arg for versados */
|
|
ferror("can't open %s",argv[i]);
|
|
if( fcreat(argv[2],&obuf,0) < 0 || fcreat(argv[3],&sbuf,0) < 0 )
|
|
ferror("temp creation error");
|
|
obp = &obuf;
|
|
lineno++;
|
|
frstp = -1; /* [vlh] 3.4 - initialize only once */
|
|
syminit();
|
|
while( !peek(EOF) )
|
|
doextdef();
|
|
outeof();
|
|
outdata();
|
|
copysfile(argv[3]);
|
|
exit(errcnt!=0);
|
|
}
|
|
|
|
/* usage - output usage error message and die*/
|
|
usage()
|
|
{
|
|
ferror("usage: c068 source icode str [-e] [-f] [-w]");
|
|
}
|
|
|
|
/* error - report an error message*/
|
|
/* outputs current line number and error message*/
|
|
error(s,x1,x2,x3,x4,x5,x6) /* returns - none*/
|
|
char *s; /* error message*/
|
|
int x1, x2, x3, x4, x5, x6; /* args for printf*/
|
|
{
|
|
register char *savep;
|
|
|
|
savep = obp;
|
|
obp = 0;
|
|
errcnt++;
|
|
if (!inclflag) {
|
|
if( lineno )
|
|
printf("* %d: ",lineno);
|
|
}
|
|
else /*[vlh] generate filename and approp line #*/
|
|
printf("%s: * %d: ",inclfile,inclline);
|
|
printf(s,x1,x2,x3,x4,x5,x6);
|
|
printf("\n");
|
|
obp = savep;
|
|
}
|
|
|
|
/* ferror - fatal error*/
|
|
/* Outputs error message and exits*/
|
|
ferror(s,x1,x2,x3,x4,x5,x6) /* returns - none*/
|
|
char *s; /* error message*/
|
|
int x1, x2, x3, x4, x5, x6; /* args for printf*/
|
|
{
|
|
error(s,x1,x2,x3,x4,x5,x6);
|
|
exit(1);
|
|
}
|
|
|
|
v6flush(v6buf)
|
|
struct iobuf *v6buf;
|
|
{
|
|
register i;
|
|
|
|
i = BLEN - v6buf->nunused;
|
|
v6buf->nunused = BLEN;
|
|
v6buf->xfree = &(v6buf->buff[0]);
|
|
if(write(v6buf->fildes,v6buf->xfree,i) != i)
|
|
return(-1);
|
|
return(0);
|
|
}
|