Public Domain YACC (part 2 of 2)
mark at ems.UUCP
mark at ems.UUCP
Sun Feb 1 17:29:36 AEST 1987
Here is part two of the public domain yacc.
Mark H. Colburn mark at ems.uucp
EMS/McGraw-Hill {rutgers|amdahl|ihnp4}!meccts!ems!mark
9855 West 78th Street
Eden Prairie, MN 55344 (612) 829-8200 x235
--------------------------------- CUT HERE -----------------------------------
#! /bin/sh
# This is a shell archive (part 2 of 2), meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh).
#
# The following files will be created:
# youtpt.c
# y2imp.c
# ydefin.c
# ywract.c
# yapack.c
# yothrs.c
# ywstat.c
# ystin.c
# system.h
# ysumry.c
# README
# yg2gen.c
# y4.h
# ycpfir.c
# yg2out.c
# ycpres.c
# y3.h
# ygin.c
# ymain.c
# yprcft.c
# ycpuni.c
# ydfout.c
# ywritm.c
# yflset.c
# yhdprd.c
# yptitm.c
# ycpycd.c
# ygtnm.c
# yskpcm.c
# yosmry.c
# y4imp.c
# ynxti.c
# ychfnd.c
# yyless.c
# yarout.c
# yerror.c
# ywarry.c
# yfdtyp.c
# yprlok.c
# ystuni.c
# yaoput.c
# y3imp.c
# ycstsh.c
# ysmnam.c
# yaryfl.c
# ychcpy.c
# yfnact.c
#
# Created by mark at ems (Mark H. Colburn) on Sun Feb 1 01:20:12 1987
#
if test -f 'youtpt.c'
then
echo shar: will not over-write existing "'youtpt.c'"
else
echo extracting "'youtpt.c'"
sed 's/^X//' >youtpt.c <<'SHAR_EOF'
X#include "y3.h"
X
Xoutput()
X{
X /* print the output for the states */
X
X int i, k, c;
X register struct wset *u, *v;
X
X fprintf( ftable, "short yyexca[] ={\n" );
X
X SLOOP(i)
X {
X /* output the stuff for state i */
X nolook = !(tystate[i] == MUSTLOOKAHEAD);
X closure(i);
X /* output actions */
X nolook = 1;
X aryfil( temp1, ntokens + nnonter + 1, 0 );
X WSLOOP(wsets, u)
X {
X c = *( u->pitem );
X if ( c > 1 && c < NTBASE && temp1[c] == 0 ) {
X WSLOOP(u, v)
X {
X if ( c == *(v->pitem) )
X putitem( v->pitem + 1, (struct looksets *)0 );
X }
X temp1[c] = state(c);
X } else if ( c > NTBASE && temp1[ (c -= NTBASE) + ntokens ] == 0 ) {
X temp1[ c+ntokens ] = amem[indgo[i]+c];
X }
X }
X
X if ( i == 1 )
X temp1[1] = ACCEPTCODE;
X
X /* now, we have the shifts; look at the reductions */
X
X lastred = 0;
X WSLOOP(wsets, u)
X {
X c = *( u->pitem );
X if ( c <= 0 ) {
X /* reduction */
X lastred = -c;
X TLOOP(k)
X {
X if ( BIT(u->ws.lset, k) ) {
X if ( temp1[k] == 0 )
X temp1[k] = c;
X else if ( temp1[k] < 0 ) {
X /* reduce/reduce conflict */
X if ( foutput != NULL )
X fprintf( foutput,
X "\n%d: reduce/reduce conflict (red'ns %d and %d ) on %s",
X i, -temp1[k], lastred, symnam(k) );
X if ( -temp1[k] > lastred )
X temp1[k] = -lastred;
X ++zzrrconf;
X } else {
X /* potential shift/reduce conflict */
X precftn( lastred, k, i );
X }
X }
X }
X }
X }
X wract(i);
X }
X
X fprintf( ftable, "\t};\n" );
X
X wdef( "YYNPROD", nprod );
X
X}
X
X
SHAR_EOF
if test 1597 -ne "`wc -c < 'youtpt.c'`"
then
echo shar: error transmitting "'youtpt.c'" '(should have been 1597 characters)'
fi
chmod 644 youtpt.c
fi
if test -f 'y2imp.c'
then
echo shar: will not over-write existing "'y2imp.c'"
else
echo extracting "'y2imp.c'"
sed 's/^X//' >y2imp.c <<'SHAR_EOF'
X/*
X * y2imp.c - impure date needed by routines pulled from y2.c
X *
X * HISTORY
X */
X
X#define y2imp YES
X#include "dtxtrn.h"
X
X
X/* communication variables between various I/O routines */
X
Xchar *infile; /* input file name */
Xint numbval; /* value of an input number */
Xchar tokname[NAMESIZE]; /* input token name */
X
X
X/* storage of names */
X
Xchar cnames[CNAMSZ]; /* token and nonterminal name storage */
Xint cnamsz = CNAMSZ; /* size of cnames */
Xchar *cnamp = cnames; /* place where next name is to be put in */
Xint ndefout = 3; /* number of defined symbols output */
X
X
X/* storage of types */
X
Xint ntypes; /* number of types defined */
Xchar *typeset[NTYPES]; /* pointers to type tags */
X
X
X/* symbol tables for tokens and nonterminals */
X
Xint ntokens = 0;
Xstruct toksymb tokset[NTERMS];
Xint toklev[NTERMS];
Xint nnonter = -1;
Xstruct ntsymb nontrst[NNONTERM];
Xint start; /* start symbol */
X
X
X/* assigned token type values */
X
Xint extval = 0;
X
X
X/* input and output file descriptors */
X
XFILE *finput; /* yacc input file */
XFILE *faction; /* file for saving actions */
XFILE *fdefine; /* file for # defines */
XFILE *ftable; /* y.tab.c file */
XFILE *ftemp; /* tempfile to pass 2 */
XFILE *foutput; /* y.output file */
X
X
X/* storage for grammar rules */
X
Xint mem0[MEMSIZE]; /* production storage */
Xint *mem = mem0;
Xint nprod = 1; /* number of productions */
Xint *prdptr[NPROD]; /* pointers to descriptions of productions */
Xint levprd[NPROD]; /* precedence levels for the productions */
X
X
X/* Statics pulled from modules */
X
Xint peekline; /* from gettok() */
SHAR_EOF
if test 1586 -ne "`wc -c < 'y2imp.c'`"
then
echo shar: error transmitting "'y2imp.c'" '(should have been 1586 characters)'
fi
chmod 644 y2imp.c
fi
if test -f 'ydefin.c'
then
echo shar: will not over-write existing "'ydefin.c'"
else
echo extracting "'ydefin.c'"
sed 's/^X//' >ydefin.c <<'SHAR_EOF'
X#include "y2.h"
X
Xdefin( t, s )
Xregister char *s;
X
X{
X /* define s to be a terminal if t=0
X or a nonterminal if t=1 */
X
X register val;
X
X if (t) {
X if ( ++nnonter >= NNONTERM )
X error("too many nonterminals, limit %d", NNONTERM);
X nontrst[nnonter].name = cstash(s);
X return( NTBASE + nnonter );
X }
X /* must be a token */
X if ( ++ntokens >= NTERMS )
X error("too many terminals, limit %d", NTERMS );
X tokset[ntokens].name = cstash(s);
X
X /* establish value for token */
X
X if ( s[0] == ' ' && s[2] == '\0' ) /* single character literal */
X val = s[1];
X else if ( s[0] == ' ' && s[1] == '\\' ) {
X /* escape sequence */
X if ( s[3] == '\0' ) {
X /* single character escape sequence */
X switch ( s[2] ) {
X /* character which is escaped */
X case 'n':
X val = '\n';
X break;
X case 'r':
X val = '\r';
X break;
X case 'b':
X val = '\b';
X break;
X case 't':
X val = '\t';
X break;
X case 'f':
X val = '\f';
X break;
X case '\'':
X val = '\'';
X break;
X case '"':
X val = '"';
X break;
X case '\\':
X val = '\\';
X break;
X default:
X error( "invalid escape" );
X }
X } else if ( s[2] <= '7' && s[2] >= '0' ) {
X /* \nnn sequence */
X if ( s[3] < '0' || s[3] > '7' || s[4] < '0' ||
X s[4] > '7' || s[5] != '\0' )
X error("illegal \\nnn construction" );
X val = 64 * s[2] + 8 * s[3] + s[4] - 73 * '0';
X if ( val == 0 )
X error( "'\\000' is illegal" );
X }
X } else {
X val = extval++;
X }
X tokset[ntokens].value = val;
X toklev[ntokens] = 0;
X return( ntokens );
X}
X
X
SHAR_EOF
if test 1550 -ne "`wc -c < 'ydefin.c'`"
then
echo shar: error transmitting "'ydefin.c'" '(should have been 1550 characters)'
fi
chmod 644 ydefin.c
fi
if test -f 'ywract.c'
then
echo shar: will not over-write existing "'ywract.c'"
else
echo extracting "'ywract.c'"
sed 's/^X//' >ywract.c <<'SHAR_EOF'
X#include "y3.h"
X
Xwract(i)
X{
X /* output state i */
X /* temp1 has the actions, lastred the default */
X int p, p0, p1;
X int ntimes, tred, count, j;
X int flag;
X
X /* find the best choice for lastred */
X
X lastred = 0;
X ntimes = 0;
X TLOOP(j)
X {
X if ( temp1[j] >= 0 )
X continue;
X if ( temp1[j] + lastred == 0 )
X continue;
X /* count the number of appearances of temp1[j] */
X count = 0;
X tred = -temp1[j];
X levprd[tred] |= REDFLAG;
X TLOOP(p)
X {
X if ( temp1[p] + tred == 0 )
X ++count;
X }
X if ( count > ntimes ) {
X lastred = tred;
X ntimes = count;
X }
X }
X
X /* for error recovery, arrange that, if there is a shift on the
X /* error recovery token, `error', that the default be the error action */
X if ( temp1[1] > 0 )
X lastred = 0;
X
X /* clear out entries in temp1 which equal lastred */
X TLOOP(p) if ( temp1[p] + lastred == 0 )
X temp1[p] = 0;
X
X wrstate(i);
X defact[i] = lastred;
X
X flag = 0;
X TLOOP(p0)
X {
X if ( (p1 = temp1[p0]) != 0 ) {
X if ( p1 < 0 ) {
X p1 = -p1;
X goto exc;
X } else if ( p1 == ACCEPTCODE ) {
X p1 = -1;
X goto exc;
X } else if ( p1 == ERRCODE ) {
X p1 = 0;
X goto exc;
Xexc:
X if ( flag++ == 0 )
X fprintf( ftable, "-1, %d,\n", i );
X fprintf( ftable, "\t%d, %d,\n", tokset[p0].value, p1 );
X ++zzexcp;
X } else {
X fprintf( ftemp, "%d,%d,", tokset[p0].value, p1 );
X ++zzacent;
X }
X }
X }
X if ( flag ) {
X defact[i] = -2;
X fprintf( ftable, "\t-2, %d,\n", lastred );
X }
X fprintf( ftemp, "\n" );
X return;
X}
X
X
SHAR_EOF
if test 1499 -ne "`wc -c < 'ywract.c'`"
then
echo shar: error transmitting "'ywract.c'" '(should have been 1499 characters)'
fi
chmod 644 ywract.c
fi
if test -f 'yapack.c'
then
echo shar: will not over-write existing "'yapack.c'"
else
echo extracting "'yapack.c'"
sed 's/^X//' >yapack.c <<'SHAR_EOF'
X/*
X * yapack.c -
X *
X * HISTORY
X * {1} 28-Aug-81 Bob Denny
X * Modified to make debug code conditionally compile.
X */
X
X#include "y3.h"
X
X
Xint apack(p, n )
Xint *p;
X{
X /* pack state i from temp1 into amem */
X int off;
X register *pp, *qq, *rr;
X int *q, *r;
X
X /*
X * we don't need to worry about checking because we we will only
X * look entries known to be there...
X */
X
X /* eliminate leading and trailing 0's */
X
X q = p + n;
X for (pp = p, off = 0; *pp == 0 && pp <= q; ++pp, --off)
X /* VOID */;
X if (pp > q)
X return (0); /* no actions */
X p = pp;
X
X /* now, find a place for the elements from p to q, inclusive */
X
X r = &amem[ACTSIZE - 1];
X for (rr = amem; rr <= r; ++rr, ++off) {
X /* try rr */
X for (qq = rr, pp = p; pp <= q; ++pp, ++qq) {
X if (*pp != 0) {
X if (*pp != *qq && *qq != 0)
X goto nextk;
X }
X }
X
X /* we have found an acceptable k */
X
X#ifdef debug
X if (foutput != NULL)
X fprintf(foutput, "off = %d, k = %d\n", off, rr - amem);
X#endif
X for (qq = rr, pp = p; pp <= q; ++pp, ++qq) {
X if (*pp) {
X if (qq > r)
X error("action table overflow");
X if (qq > memp)
X memp = qq;
X *qq = *pp;
X }
X }
X#ifdef debug
X if (foutput != NULL) {
X for (pp = amem; pp <= memp; pp += 10) {
X fprintf(foutput, "\t");
X for (qq = pp; qq <= pp + 9; ++qq)
X fprintf(foutput, "%d ", *qq);
X fprintf(foutput, "\n");
X }
X }
X#endif
X return (off);
Xnextk:
X ;
X }
X error("no space in action table");
X /* NOTREACHED */
X}
X
X
SHAR_EOF
if test 1450 -ne "`wc -c < 'yapack.c'`"
then
echo shar: error transmitting "'yapack.c'" '(should have been 1450 characters)'
fi
chmod 644 yapack.c
fi
if test -f 'yothrs.c'
then
echo shar: will not over-write existing "'yothrs.c'"
else
echo extracting "'yothrs.c'"
sed 's/^X//' >yothrs.c <<'SHAR_EOF'
X/* Edits:
X * 06-Dec-80 Original code broken out of y1.c.
X * 18-Dec-80 Add conditional code for Decus for tempfile deletion.
X */
X
X#include "y1.h"
X
Xint others()
X{
X /* put out other arrays, copy the parsers */
X register c, i, j;
X
X finput = (FILE * )fopen(PARSER, "r");
X if (finput == (FILE * )NULL)
X error("cannot find parser %s", PARSER);
X
X warray("yyr1", levprd, nprod);
X
X aryfil(temp1, nprod, 0);
X PLOOP(1, i) temp1[i] = prdptr[i + 1] - prdptr[i] - 2;
X warray("yyr2", temp1, nprod);
X
X aryfil(temp1, nstate, -1000);
X TLOOP(i) {
X for (j = tstates[i]; j != 0; j = mstates[j]) {
X temp1[j] = tokset[i].value;
X }
X }
X NTLOOP(i) {
X for (j = ntstates[i]; j != 0; j = mstates[j]) {
X temp1[j] = -i;
X }
X }
X warray("yychk", temp1, nstate);
X
X warray("yydef", defact, nstate);
X
X /* copy parser text */
X
X while ((c = unix_getc(finput)) != EOF) {
X if (c == '$') {
X if ((c = unix_getc(finput)) != 'A')
X putc('$', ftable);
X else {
X /* copy actions */
X faction = fopen(ACTNAME, "r");
X if (faction == NULL)
X error("cannot reopen action tempfile");
X while ((c = unix_getc(faction)) != EOF)
X putc(c, ftable);
X fclose(faction);
X ZAPFILE(ACTNAME);
X c = unix_getc(finput);
X }
X }
X putc(c, ftable);
X }
X fclose(ftable);
X}
X
X
Xint unix_getc(iop)
XFILE *iop;
X{
X int c;
X
X c = getc(iop);
X /* Stop on Control-Z */
X if (c == '\032')
X return (EOF);
X else
X return (c);
X}
X
X
SHAR_EOF
if test 1395 -ne "`wc -c < 'yothrs.c'`"
then
echo shar: error transmitting "'yothrs.c'" '(should have been 1395 characters)'
fi
chmod 644 yothrs.c
fi
if test -f 'ywstat.c'
then
echo shar: will not over-write existing "'ywstat.c'"
else
echo extracting "'ywstat.c'"
sed 's/^X//' >ywstat.c <<'SHAR_EOF'
X#include "y3.h"
X
Xwrstate(i)
X{
X /* writes state i */
X register j0, j1;
X register struct item *pp, *qq;
X register struct wset *u;
X
X if ( foutput == NULL )
X return;
X fprintf( foutput, "\nstate %d\n", i);
X ITMLOOP(i, pp, qq) fprintf( foutput, "\t%s\n", writem(pp->pitem));
X if ( tystate[i] == MUSTLOOKAHEAD ) {
X /* print out empty productions in closure */
X WSLOOP( wsets + (pstate[i+1] - pstate[i]), u )
X {
X if ( *(u->pitem) < 0 )
X fprintf( foutput, "\t%s\n", writem(u->pitem) );
X }
X }
X
X /* check for state equal to another */
X
X TLOOP(j0) if ( (j1 = temp1[j0]) != 0 ) {
X fprintf( foutput, "\n\t%s ", symnam(j0) );
X if ( j1 > 0 ) {
X /* shift, error, or accept */
X if ( j1 == ACCEPTCODE )
X fprintf( foutput, "accept" );
X else if ( j1 == ERRCODE )
X fprintf( foutput, "error" );
X else
X fprintf( foutput, "shift %d", j1 );
X } else
X fprintf( foutput, "reduce %d", -j1 );
X }
X
X /* output the final production */
X
X if ( lastred )
X fprintf( foutput, "\n\t. reduce %d\n\n", lastred );
X else
X fprintf( foutput, "\n\t. error\n\n" );
X
X /* now, output nonterminal actions */
X
X j1 = ntokens;
X for ( j0 = 1; j0 <= nnonter; ++j0 ) {
X if ( temp1[++j1] )
X fprintf( foutput, "\t%s goto %d\n", symnam( j0 + NTBASE), temp1[j1] );
X }
X
X}
X
X
Xwdef( s, n )
Xchar *s;
X
X{
X /* output a definition of s to the value n */
X fprintf( ftable, "# define %s %d\n", s, n );
X}
X
X
SHAR_EOF
if test 1388 -ne "`wc -c < 'ywstat.c'`"
then
echo shar: error transmitting "'ywstat.c'" '(should have been 1388 characters)'
fi
chmod 644 ywstat.c
fi
if test -f 'ystin.c'
then
echo shar: will not over-write existing "'ystin.c'"
else
echo extracting "'ystin.c'"
sed 's/^X//' >ystin.c <<'SHAR_EOF'
X#include "y4.h"
X
Xstin(i)
X{
X register *r, *s, n, flag, j, *q1, *q2;
X
X greed[i] = 0;
X
X /* enter state i into the a array */
X
X q2 = mem0 + yypact[i+1];
X q1 = mem0 + yypact[i];
X /* find an acceptable place */
X
X for ( n = -maxoff; n < ACTSIZE; ++n ) {
X
X flag = 0;
X for ( r = q1; r < q2; r += 2 ) {
X if ( (s = *r + n + a ) < a )
X goto nextn;
X if ( *s == 0 )
X ++flag;
X else if ( *s != r[1] )
X goto nextn;
X }
X
X /* check that the position equals another only if the states are identical */
X
X for ( j = 0; j < nstate; ++j ) {
X if ( pa[j] == n ) {
X if ( flag )
X goto nextn; /* we have some disagreement */
X if ( yypact[j+1] + yypact[i] == yypact[j] + yypact[i+1] ) {
X /* states are equal */
X pa[i] = n;
X if ( adb > 1 )
X fprintf( ftable, "State %d: entry at %d equals state %d\n",
X i, n, j );
X return;
X }
X goto nextn; /* we have some disagreement */
X }
X }
X
X for ( r = q1; r < q2; r += 2 ) {
X if ( (s = *r + n + a ) >= &a[ACTSIZE] )
X error( "out of space in optimizer a array" );
X if ( s > maxa )
X maxa = s;
X if ( *s != 0 && *s != r[1] )
X error( "clobber of a array, pos'n %d, by %d", s - a, r[1] );
X *s = r[1];
X }
X pa[i] = n;
X if ( adb > 1 )
X fprintf( ftable, "State %d: entry at %d\n", i, pa[i] );
X return;
X
Xnextn:
X ;
X }
X
X error( "Error; failure to place state %d\n", i );
X}
X
X
SHAR_EOF
if test 1373 -ne "`wc -c < 'ystin.c'`"
then
echo shar: error transmitting "'ystin.c'" '(should have been 1373 characters)'
fi
chmod 644 ystin.c
fi
if test -f 'system.h'
then
echo shar: will not over-write existing "'system.h'"
else
echo extracting "'system.h'"
sed 's/^X//' >system.h <<'SHAR_EOF'
X/* *********************
X * * S Y S T E M . H *
X * *********************
X *
X * This file replaces the original "files." header file. It defines, for
X * the IBM PC/XT version, the target parser function source file, overriding
X * file name string defines, and other system-specific definitions and
X * parameters.
X *
X * Bob Denny 06-Dec-80
X *
X * Edits:
X * 18-Dec-80 ZAPFILE no longer used in Decus Yacc.
X * Parser file renamed yypars.c
X *
X * 28-Aug-81 Temp files for RSX have specific version
X * numbers of 1 to avoid multi-versions. Rename
X * parser info file ".i".
X *
X * 12-Apr-83 Add FNAMESIZE & EX_xxx parameters.
X *
X *Scott Guthery 23-Dec-83 Adapt for the IBM PC/XT & DeSmet C compiler.
X *
X */
X
X/* Define WORD32 if target machine is a 32 bitter */
X#define WORD32
X
X/*
X * Target parser source file
X */
X# define PARSER "yypars.c"
X
X/*
X * basic size of the Yacc implementation
X */
X# define MEDIUM
X
X/*
X * Table size for this Yacc
X */
X# define HUGETAB YES
X
X/*
X * Filespec definitions
X */
X# define ACTNAME "yacc2.tmp"
X# define TEMPNAME "yacc1.tmp"
X# define FNAMESIZE 24
X
X/*
X * Exit status values
X */
X#define EX_SUC 1
X#define EX_WAR 0
X#define EX_ERR 2
X#define EX_SEV 4
SHAR_EOF
if test 1368 -ne "`wc -c < 'system.h'`"
then
echo shar: error transmitting "'system.h'" '(should have been 1368 characters)'
fi
chmod 644 system.h
fi
if test -f 'ysumry.c'
then
echo shar: will not over-write existing "'ysumry.c'"
else
echo extracting "'ysumry.c'"
sed 's/^X//' >ysumry.c <<'SHAR_EOF'
X#include "y1.h"
X
Xsummary()
X{
X /* output the summary on the tty */
X
X if ( foutput != NULL ) {
X fprintf( foutput, "\n%d/%d terminals, %d/%d nonterminals\n", ntokens, NTERMS,
X nnonter, NNONTERM );
X fprintf( foutput, "%d/%d grammar rules, %d/%d states\n", nprod, NPROD, nstate, NSTATES );
X fprintf( foutput, "%d shift/reduce, %d reduce/reduce conflicts reported\n", zzsrconf, zzrrconf );
X fprintf( foutput, "%d/%d working sets used\n", zzcwp - wsets, WSETSIZE );
X fprintf( foutput, "memory: states,etc. %d/%d, parser %d/%d\n", zzmemsz - mem0, MEMSIZE,
X memp - amem, ACTSIZE );
X fprintf( foutput, "%d/%d distinct lookahead sets\n", nlset, LSETSIZE );
X fprintf( foutput, "%d extra closures\n", zzclose - 2 * nstate );
X fprintf( foutput, "%d shift entries, %d exceptions\n", zzacent, zzexcp );
X fprintf( foutput, "%d goto entries\n", zzgoent );
X fprintf( foutput, "%d entries saved by goto default\n", zzgobest );
X }
X if ( zzsrconf != 0 || zzrrconf != 0 ) {
X fprintf( stdout, "\nconflicts: ");
X if ( zzsrconf )
X fprintf( stdout, "%d shift/reduce" , zzsrconf );
X if ( zzsrconf && zzrrconf )
X fprintf( stdout, ", " );
X if ( zzrrconf )
X fprintf( stdout, "%d reduce/reduce" , zzrrconf );
X fprintf( stdout, "\n" );
X }
X
X fclose( ftemp );
X if ( fdefine != NULL )
X fclose( fdefine );
X}
X
X
SHAR_EOF
if test 1307 -ne "`wc -c < 'ysumry.c'`"
then
echo shar: error transmitting "'ysumry.c'" '(should have been 1307 characters)'
fi
chmod 644 ysumry.c
fi
if test -f 'README'
then
echo shar: will not over-write existing "'README'"
else
echo extracting "'README'"
sed 's/^X//' >README <<'SHAR_EOF'
X Sun Feb 1 00:52:01 CST 1987
X
X UNIX/MS-DOS YACC
X
X Here is a copy of a public domain version of YACC. This version
X is a derivative of the DECUS yacc (at lease some where along the
X it come from there anyways). When I got it it had been modified
X to run under MS-DOS on IBM-PC's. I have modified it to, (once
X again) run under UNIX, as well as PC-DOS.
X
X It runs fine under System V.2 on an Arete 1200, as well as PC-DOS
X 3.1. I do not have access to a Berkley machine, so I have not
X been able to test it in that environment.
X
X I will post updates and patches to this version of YACC as I work
X with it more, and as I get comments from other people who use it.
X If you have any enhancements, portability problems or comments,
X please let me know and I will put them in.
X
X For those of you who have been wanting YACC on a PC, here it is.
X
X In order to install the package, look at the #defines in system.h
X and dtxtrn.h and modify them to match you machine configuration
X and needs/desires. Then type make.
X
X
X Mark H. Colburn mark at ems.uucp
X EMS/McGraw-Hill {rutgers|amdahl|ihnp4}!meccts!ems!mark
X 9855 West 78th Street
X Eden Prairie, MN 55344 (612) 829-8200 x235
SHAR_EOF
if test 1277 -ne "`wc -c < 'README'`"
then
echo shar: error transmitting "'README'" '(should have been 1277 characters)'
fi
chmod 644 README
fi
if test -f 'yg2gen.c'
then
echo shar: will not over-write existing "'yg2gen.c'"
else
echo extracting "'yg2gen.c'"
sed 's/^X//' >yg2gen.c <<'SHAR_EOF'
X#include "y3.h"
X
X/*
X * yg2gen.3c
X *
X * Modified to make debug code conditionally compile.
X * 28-Aug-81
X * Bob Denny
X */
X
Xgo2gen(c)
X
X{
X /* output the gotos for nonterminal c */
X
X int i, work, cc;
X struct item *p, *q;
X
X
X /* first, find nonterminals with gotos on c */
X
X aryfil( temp1, nnonter + 1, 0 );
X temp1[c] = 1;
X
X work = 1;
X while ( work ) {
X
X work = 0;
X PLOOP(0, i)
X
X {
X if ( (cc = prdptr[i][1] - NTBASE) >= 0 ) {
X
X /* cc is a nonterminal */
X if ( temp1[cc] != 0 ) {
X
X /* cc has a goto on c */
X cc = *prdptr[i] - NTBASE; /* thus, the left side of production i does too */
X if ( temp1[cc] == 0 ) {
X
X work = 1;
X temp1[cc] = 1;
X }
X }
X }
X }
X }
X
X /* now, we have temp1[c] = 1 if a goto on c in closure of cc */
X
X#ifdef debug
X if ( foutput != NULL ) {
X
X fprintf( foutput, "%s: gotos on ", nontrst[c].name );
X NTLOOP(i) if ( temp1[i] )
X fprintf( foutput, "%s ", nontrst[i].name);
X fprintf( foutput, "\n");
X }
X#endif
X /* now, go through and put gotos into tystate */
X
X aryfil( tystate, nstate, 0 );
X SLOOP(i)
X
X {
X ITMLOOP(i, p, q)
X
X {
X if ( (cc = *p->pitem) >= NTBASE ) {
X
X if ( temp1[cc -= NTBASE] ) {
X
X /* goto on c is possible */
X tystate[i] = amem[indgo[i]+c];
X break;
X }
X }
X }
X }
X}
X
X
SHAR_EOF
if test 1263 -ne "`wc -c < 'yg2gen.c'`"
then
echo shar: error transmitting "'yg2gen.c'" '(should have been 1263 characters)'
fi
chmod 644 yg2gen.c
fi
if test -f 'y4.h'
then
echo shar: will not over-write existing "'y4.h'"
else
echo extracting "'y4.h'"
sed 's/^X//' >y4.h <<'SHAR_EOF'
X/*****************************************************************************/
X/* ************* */
X/* * Y 4 . H * */
X/* ************* */
X/* */
X/* This file contains the external declarations needed to hook Yacc modules */
X/* which were originally in Y4.C to their impure data in Y4IMP.4C. Also does */
X/* the include of the original data/external file DTXTRN.H. */
X/* */
X/*****************************************************************************/
X
X# include "dtxtrn.h"
X
X# define a amem
X# define pa indgo
X# define yypact temp1
X# define greed tystate
X
X# define NOMORE -1000
X
Xextern int *ggreed;
Xextern int *pgo;
Xextern int *yypgo;
X
Xextern int maxspr; /* maximum spread of any entry */
Xextern int maxoff; /* maximum offset into a array */
Xextern int *pmem;
Xextern int *maxa;
Xextern int nxdb;
Xextern int adb;
SHAR_EOF
if test 1184 -ne "`wc -c < 'y4.h'`"
then
echo shar: error transmitting "'y4.h'" '(should have been 1184 characters)'
fi
chmod 644 y4.h
fi
if test -f 'ycpfir.c'
then
echo shar: will not over-write existing "'ycpfir.c'"
else
echo extracting "'ycpfir.c'"
sed 's/^X//' >ycpfir.c <<'SHAR_EOF'
X/*
X * ycpfir.c - compute an array with the first of nonterminals
X *
X * HISTORY
X * {1} 28-Aug-81 Bob Denny
X * Modified to make debug code conditionally compile.
X *
X */
X
X#include "y1.h"
X
X
X
Xint cpfir()
X{
X /* compute an array with the first of nonterminals */
X register *p, **s, i, **t, ch, changes;
X
X zzcwp = &wsets[nnonter];
X NTLOOP(i) {
X aryfil(wsets[i].ws.lset, tbitset, 0);
X t = pres[i + 1];
X for (s = pres[i]; s < t; ++s) {
X /* initially fill the sets */
X for (p = *s; (ch = *p) > 0; ++p) {
X if (ch < NTBASE) {
X SETBIT(wsets[i].ws.lset, ch);
X break;
X } else if (!pempty[ch - NTBASE])
X break;
X }
X }
X }
X
X /* now, reflect transitivity */
X
X changes = 1;
X while (changes) {
X changes = 0;
X NTLOOP(i) {
X t = pres[i + 1];
X for (s = pres[i]; s < t; ++s) {
X for (p = *s; (ch = (*p - NTBASE)) >= 0; ++p) {
X changes |= setunion(wsets[i].ws.lset, wsets[ch].ws.lset);
X if (!pempty[ch])
X break;
X }
X }
X }
X }
X
X NTLOOP(i) pfirst[i] = flset(&wsets[i].ws);
X#ifdef debug
X if ((foutput != NULL)) {
X NTLOOP(i) {
X fprintf(foutput, "\n%s: ", nontrst[i].name);
X prlook(pfirst[i]);
X fprintf(foutput, " %d\n", pempty[i]);
X }
X }
X#endif
X}
X
X
SHAR_EOF
if test 1180 -ne "`wc -c < 'ycpfir.c'`"
then
echo shar: error transmitting "'ycpfir.c'" '(should have been 1180 characters)'
fi
chmod 644 ycpfir.c
fi
if test -f 'yg2out.c'
then
echo shar: will not over-write existing "'yg2out.c'"
else
echo extracting "'yg2out.c'"
sed 's/^X//' >yg2out.c <<'SHAR_EOF'
X#include "y3.h"
X
Xgo2out()
X{
X /* output the gotos for the nontermninals */
X int i, j, k, best, count, cbest, times;
X
X fprintf( ftemp, "$\n" ); /* mark begining of gotos */
X
X for ( i = 1; i <= nnonter; ++i ) {
X go2gen(i);
X
X /* find the best one to make default */
X
X best = -1;
X times = 0;
X
X for ( j = 0; j <= nstate; ++j ) {
X /* is j the most frequent */
X if ( tystate[j] == 0 )
X continue;
X if ( tystate[j] == best )
X continue;
X
X /* is tystate[j] the most frequent */
X
X count = 0;
X cbest = tystate[j];
X
X for ( k = j; k <= nstate; ++k )
X if ( tystate[k] == cbest )
X ++count;
X
X if ( count > times ) {
X best = cbest;
X times = count;
X }
X }
X
X /* best is now the default entry */
X
X zzgobest += (times - 1);
X for ( j = 0; j <= nstate; ++j ) {
X if ( tystate[j] != 0 && tystate[j] != best ) {
X fprintf( ftemp, "%d,%d,", j, tystate[j] );
X zzgoent += 1;
X }
X }
X
X /* now, the default */
X
X zzgoent += 1;
X fprintf( ftemp, "%d\n", best );
X
X }
X}
X
X
SHAR_EOF
if test 994 -ne "`wc -c < 'yg2out.c'`"
then
echo shar: error transmitting "'yg2out.c'" '(should have been 994 characters)'
fi
chmod 644 yg2out.c
fi
if test -f 'ycpres.c'
then
echo shar: will not over-write existing "'ycpres.c'"
else
echo extracting "'ycpres.c'"
sed 's/^X//' >ycpres.c <<'SHAR_EOF'
X/*
X * ycpres.c - compute an array with the beginnings of productions
X *
X * compute an array with the beginnings of productions yielding given
X * nonterminals The array pres points to these lists the array pyield has
X * the lists: the total size is only NPROD+1
X *
X * HISTORY
X * {1} 12-Apr-83 Bob Denny
X * Add symbol exit status.
X *
X */
X
X#include "y1.h"
X
X
Xextern int *pyield[NPROD];
X
X
Xint cpres()
X{
X register **pmem;
X register c, j, i;
X
X pmem = pyield;
X
X NTLOOP(i) {
X c = i + NTBASE;
X pres[i] = pmem;
X fatfl = 0; /* make undefined symbols nonfatal */
X PLOOP(0, j) {
X if (*prdptr[j] == c)
X *pmem++ = prdptr[j] + 1;
X }
X if (pres[i] == pmem) {
X error("nonterminal %s not defined!", nontrst[i].name);
X }
X }
X pres[i] = pmem;
X fatfl = 1;
X if (nerrors) {
X summary();
X exit(EX_ERR);
X }
X if (pmem != &pyield[nprod])
X error("internal Yacc error: pyield %d", pmem - &pyield[nprod]);
X}
X
X
SHAR_EOF
if test 905 -ne "`wc -c < 'ycpres.c'`"
then
echo shar: error transmitting "'ycpres.c'" '(should have been 905 characters)'
fi
chmod 644 ycpres.c
fi
if test -f 'y3.h'
then
echo shar: will not over-write existing "'y3.h'"
else
echo extracting "'y3.h'"
sed 's/^X//' >y3.h <<'SHAR_EOF'
X/*****************************************************************************/
X/* ************* */
X/* * Y 3 . H * */
X/* ************* */
X/* */
X/* This file contains the external declarations needed to hook Yacc modules */
X/* which were originally in Y3.C to their impure data in Y3IMP.3C. Also does */
X/* the include of the original data/external file DTXTRN.H. */
X/* */
X/*****************************************************************************/
X
X#include "dtxtrn.h"
X
Xextern int lastred; /* the number of the last reduction of a state */
SHAR_EOF
if test 894 -ne "`wc -c < 'y3.h'`"
then
echo shar: error transmitting "'y3.h'" '(should have been 894 characters)'
fi
chmod 644 y3.h
fi
if test -f 'ygin.c'
then
echo shar: will not over-write existing "'ygin.c'"
else
echo extracting "'ygin.c'"
sed 's/^X//' >ygin.c <<'SHAR_EOF'
X#include "y4.h"
X
Xgin(i)
X{
X
X register *p, *r, *s, *q1, *q2;
X
X /* enter gotos on nonterminal i into array a */
X
X ggreed[i] = 0;
X
X q2 = mem0 + yypgo[i+1] - 1;
X q1 = mem0 + yypgo[i];
X
X /* now, find a place for it */
X
X for ( p = a; p < &a[ACTSIZE]; ++p ) {
X if ( *p )
X continue;
X for ( r = q1; r < q2; r += 2 ) {
X s = p + *r + 1;
X if ( *s )
X goto nextgp;
X if ( s > maxa ) {
X if ( (maxa = s) > &a[ACTSIZE] )
X error( "a array overflow" );
X }
X }
X /* we have found a spot */
X
X *p = *q2;
X if ( p > maxa ) {
X if ( (maxa = p) > &a[ACTSIZE] )
X error( "a array overflow" );
X }
X for ( r = q1; r < q2; r += 2 ) {
X s = p + *r + 1;
X *s = r[1];
X }
X
X pgo[i] = p - a;
X if ( adb > 1 )
X fprintf( ftable, "Nonterminal %d, entry at %d\n" , i, pgo[i] );
X goto nextgi;
X
Xnextgp:
X ;
X }
X
X error( "cannot place goto %d\n", i );
X
Xnextgi:
X ;
X}
X
X
SHAR_EOF
if test 862 -ne "`wc -c < 'ygin.c'`"
then
echo shar: error transmitting "'ygin.c'" '(should have been 862 characters)'
fi
chmod 644 ygin.c
fi
if test -f 'ymain.c'
then
echo shar: will not over-write existing "'ymain.c'"
else
echo extracting "'ymain.c'"
sed 's/^X//' >ymain.c <<'SHAR_EOF'
X#include "y1.h"
X/*
X * 12-Apr-83 (RBD) Add symbolic exit status
X */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X
X{
X
X puts("Setup...");
X setup(argc, argv); /* initialize and read productions */
X puts("cpres ...");
X tbitset = NWORDS(ntokens);
X cpres(); /* make table of which productions yield a given nonterminal */
X puts("cempty ...");
X cempty(); /* make a table of which nonterminals can match the empty string */
X puts("cpfir ...");
X cpfir(); /* make a table of firsts of nonterminals */
X puts("stagen ...");
X stagen(); /* generate the states */
X puts("output ...");
X output(); /* write the states and the tables */
X puts("go2out ...");
X go2out();
X puts("hideprod ...");
X hideprod();
X puts("summary ...");
X summary();
X puts("callopt ...");
X callopt();
X puts("others ...");
X others();
X puts("DONE !!!");
X exit(EX_SUC);
X}
X
X
SHAR_EOF
if test 822 -ne "`wc -c < 'ymain.c'`"
then
echo shar: error transmitting "'ymain.c'" '(should have been 822 characters)'
fi
chmod 644 ymain.c
fi
if test -f 'yprcft.c'
then
echo shar: will not over-write existing "'yprcft.c'"
else
echo extracting "'yprcft.c'"
sed 's/^X//' >yprcft.c <<'SHAR_EOF'
X#include "y3.h"
X
Xprecftn(r, t, s)
X{
X /* decide a shift/reduce conflict by precedence.*/
X /* r is a rule number, t a token number */
X /* the conflict is in state s */
X /* temp1[t] is changed to reflect the action */
X
X int lp, lt, action;
X
X lp = levprd[r];
X lt = toklev[t];
X if ( PLEVEL(lt) == 0 || PLEVEL(lp) == 0 ) {
X /* conflict */
X if ( foutput != NULL )
X fprintf( foutput, "\n%d: shift/reduce conflict (shift %d, red'n %d) on %s",
X s, temp1[t], r, symnam(t) );
X ++zzsrconf;
X return;
X }
X if ( PLEVEL(lt) == PLEVEL(lp) )
X action = ASSOC(lt);
X else if ( PLEVEL(lt) > PLEVEL(lp) )
X action = RASC; /* shift */
X else
X action = LASC; /* reduce */
X
X switch ( action ) {
X
X case BASC: /* error action */
X temp1[t] = ERRCODE;
X return;
X
X case LASC: /* reduce */
X temp1[t] = -r;
X return;
X
X }
X}
X
X
SHAR_EOF
if test 813 -ne "`wc -c < 'yprcft.c'`"
then
echo shar: error transmitting "'yprcft.c'" '(should have been 813 characters)'
fi
chmod 644 yprcft.c
fi
if test -f 'ycpuni.c'
then
echo shar: will not over-write existing "'ycpuni.c'"
else
echo extracting "'ycpuni.c'"
sed 's/^X//' >ycpuni.c <<'SHAR_EOF'
X/*
X * ycpuni.c - copy the union declaration & define file (if present) to output
X *
X * HISTORY
X */
X
X#include "y2.h"
X
Xint cpyunion()
X{
X int level, c;
X fprintf(ftable, "\n# line %d\n", lineno);
X fprintf(ftable, "\n#define UNION 1\n");
X fprintf(ftable, "typedef union ");
X if (fdefine)
X fprintf(fdefine, "\ntypedef union ");
X
X level = 0;
X for (; ; ) {
X if ((c = unix_getc(finput)) < 0)
X error("EOF encountered while processing %%union");
X putc(c, ftable);
X if (fdefine)
X putc(c, fdefine);
X
X switch (c) {
X
X case '\n':
X ++lineno;
X break;
X
X case '{':
X ++level;
X break;
X
X case '}':
X --level;
X if (level == 0) {
X /* we are finished copying */
X fprintf(ftable, " YYSTYPE;\n");
X if (fdefine)
X fprintf(fdefine, " YYSTYPE;\nextern YYSTYPE yylval;\n");
X return;
X }
X }
X }
X}
X
X
SHAR_EOF
if test 805 -ne "`wc -c < 'ycpuni.c'`"
then
echo shar: error transmitting "'ycpuni.c'" '(should have been 805 characters)'
fi
chmod 644 ycpuni.c
fi
if test -f 'ydfout.c'
then
echo shar: will not over-write existing "'ydfout.c'"
else
echo extracting "'ydfout.c'"
sed 's/^X//' >ydfout.c <<'SHAR_EOF'
X/*
X * ydfout.c -
X *
X * HISTORY
X */
X
X#include <ctype.h>
X#include "y2.h"
X
Xint defout()
X{
X /* write out the defines (at the end of the declaration section) */
X
X register int i, c;
X register char *cp;
X
X for (i = ndefout; i <= ntokens; ++i) {
X
X cp = tokset[i].name;
X if (*cp == ' ')
X ++cp; /* literals */
X
X for (; (c = *cp) != '\0'; ++cp) {
X
X if (islower(c) || isupper(c) || isdigit(c) || c == '_')
X ; /* VOID */
X else
X goto nodef;
X }
X
X fprintf(ftable, "# define %s %d\n", tokset[i].name, tokset[i].value);
X if (fdefine != NULL)
X fprintf(fdefine, "# define %s %d\n", tokset[i].name, tokset[i].value);
X
Xnodef:
X ;
X }
X
X ndefout = ntokens + 1;
X
X}
X
X
SHAR_EOF
if test 661 -ne "`wc -c < 'ydfout.c'`"
then
echo shar: error transmitting "'ydfout.c'" '(should have been 661 characters)'
fi
chmod 644 ydfout.c
fi
if test -f 'ywritm.c'
then
echo shar: will not over-write existing "'ywritm.c'"
else
echo extracting "'ywritm.c'"
sed 's/^X//' >ywritm.c <<'SHAR_EOF'
X/*
X * ywritm.c -
X *
X * HISTORY
X */
X
X#include "y1.h"
X
Xextern char sarr[ISIZE];
X
Xchar *chcopy();
X
Xchar *writem(pp)
Xint *pp;
X{
X /* creates output string for item pointed to by pp */
X int i, *p;
X char *q;
X
X for (p = pp; *p > 0; ++p)
X ;
X p = prdptr[-*p];
X q = chcopy(sarr, nontrst[*p - NTBASE].name);
X q = chcopy(q, " : ");
X
X for (; ; ) {
X *q++ = ++p == pp ? '_' : ' ';
X *q = '\0';
X if ((i = *p) <= 0)
X break;
X q = chcopy(q, symnam(i));
X if (q > &sarr[ISIZE - 30])
X error("item too big");
X }
X
X if ((i = *pp) < 0) {
X /* an item calling for a reduction */
X q = chcopy(q, " (");
X sprintf(q, "%d)", -i);
X }
X return (sarr);
X}
X
X
SHAR_EOF
if test 634 -ne "`wc -c < 'ywritm.c'`"
then
echo shar: error transmitting "'ywritm.c'" '(should have been 634 characters)'
fi
chmod 644 ywritm.c
fi
if test -f 'yflset.c'
then
echo shar: will not over-write existing "'yflset.c'"
else
echo extracting "'yflset.c'"
sed 's/^X//' >yflset.c <<'SHAR_EOF'
X#include "y1.h"
X
Xstruct looksets *flset( p )
Xstruct looksets *p;
X
X{
X /* decide if the lookahead set pointed to by p is known */
X /* return pointer to a perminent location for the set */
X
X register struct looksets *q;
X int j, *w;
X register *u, *v;
X
X for ( q = &lkst[nlset]; q-- > lkst; ) {
X u = p->lset;
X v = q->lset;
X w = &v[tbitset];
X while ( v < w)
X if ( *u++ != *v++)
X goto more;
X /* we have matched */
X return( q );
Xmore:
X ;
X }
X /* add a new one */
X q = &lkst[nlset++];
X if ( nlset >= LSETSIZE )
X error("too many lookahead sets" );
X SETLOOP(j)
X {
X q->lset[j] = p->lset[j];
X }
X return( q );
X}
X
X
SHAR_EOF
if test 618 -ne "`wc -c < 'yflset.c'`"
then
echo shar: error transmitting "'yflset.c'" '(should have been 618 characters)'
fi
chmod 644 yflset.c
fi
if test -f 'yhdprd.c'
then
echo shar: will not over-write existing "'yhdprd.c'"
else
echo extracting "'yhdprd.c'"
sed 's/^X//' >yhdprd.c <<'SHAR_EOF'
X#include "y3.h"
X
Xhideprod()
X{
X /* in order to free up the mem and amem arrays for the optimizer,
X /* and still be able to output yyr1, etc., after the sizes of
X /* the action array is known, we hide the nonterminals
X /* derived by productions in levprd.
X */
X
X register i, j;
X
X j = 0;
X levprd[0] = 0;
X PLOOP(1, i)
X {
X if ( !(levprd[i] & REDFLAG) ) {
X ++j;
X if ( foutput != NULL ) {
X fprintf( foutput, "Rule not reduced: %s\n", writem( prdptr[i] ) );
X }
X }
X levprd[i] = *prdptr[i] - NTBASE;
X }
X if ( j )
X fprintf( stdout, "%d rules never reduced\n", j );
X}
X
X
SHAR_EOF
if test 602 -ne "`wc -c < 'yhdprd.c'`"
then
echo shar: error transmitting "'yhdprd.c'" '(should have been 602 characters)'
fi
chmod 644 yhdprd.c
fi
if test -f 'yptitm.c'
then
echo shar: will not over-write existing "'yptitm.c'"
else
echo extracting "'yptitm.c'"
sed 's/^X//' >yptitm.c <<'SHAR_EOF'
X#include "y1.h"
X
X/*
X * yptitm.1c
X *
X * Modified to make debug code conditionally compile.
X * 28-Aug-81
X * Bob Denny
X */
X
Xputitem( ptr, lptr )
Xint *ptr;
Xstruct looksets *lptr;
X
X
X{
X register struct item *j;
X
X#ifdef debug
X if ( foutput != NULL ) {
X
X fprintf( foutput, "putitem(%s), state %d\n", writem(ptr), nstate );
X }
X#endif
X j = pstate[nstate+1];
X j->pitem = ptr;
X if ( !nolook )
X j->look = flset( lptr );
X pstate[nstate+1] = ++j;
X if ( (int *)j > zzmemsz ) {
X
X zzmemsz = (int *)j;
X if ( zzmemsz >= &mem0[MEMSIZE] )
X error( "out of state space" );
X }
X}
X
X
SHAR_EOF
if test 567 -ne "`wc -c < 'yptitm.c'`"
then
echo shar: error transmitting "'yptitm.c'" '(should have been 567 characters)'
fi
chmod 644 yptitm.c
fi
if test -f 'ycpycd.c'
then
echo shar: will not over-write existing "'ycpycd.c'"
else
echo extracting "'ycpycd.c'"
sed 's/^X//' >ycpycd.c <<'SHAR_EOF'
X/*
X * ycpycd.c - copies code between \{ and \}
X *
X * HISTORY
X */
X
X#include "y2.h"
X
X
Xint cpycode()
X{
X int c;
X
X c = unix_getc(finput);
X if (c == '\n') {
X c = unix_getc(finput);
X lineno++;
X }
X fprintf(ftable, "\n# line %d\n", lineno);
X while (c >= 0) {
X if (c == '\\')
X if ((c = unix_getc(finput)) == '}')
X return;
X else
X putc('\\', ftable);
X if (c == '%')
X if ((c = unix_getc(finput)) == '}')
X return;
X else
X putc('%', ftable);
X putc(c, ftable);
X if (c == '\n')
X ++lineno;
X c = unix_getc(finput);
X }
X error("eof before %%}");
X}
X
X
SHAR_EOF
if test 557 -ne "`wc -c < 'ycpycd.c'`"
then
echo shar: error transmitting "'ycpycd.c'" '(should have been 557 characters)'
fi
chmod 644 ycpycd.c
fi
if test -f 'ygtnm.c'
then
echo shar: will not over-write existing "'ygtnm.c'"
else
echo extracting "'ygtnm.c'"
sed 's/^X//' >ygtnm.c <<'SHAR_EOF'
X/*
X * ygtnm.c -
X *
X * HISTORY
X */
X
X#include <ctype.h>
X#include "y4.h"
X
Xint gtnm()
X{
X
X register s, val, c;
X
X /* read and convert an integer from the standard input */
X /* return the terminating character */
X /* blanks, tabs, and newlines are ignored */
X
X s = 1;
X val = 0;
X
X while ((c = unix_getc(finput)) != EOF) {
X if (isdigit(c)) {
X val = val * 10 + c - '0';
X } else if (c == '-')
X s = -1;
X else if (c == '\r')
X continue;
X else
X break;
X }
X *pmem++ = s * val;
X if (pmem > &mem0[MEMSIZE])
X error("out of space");
X return (c);
X}
X
X
SHAR_EOF
if test 542 -ne "`wc -c < 'ygtnm.c'`"
then
echo shar: error transmitting "'ygtnm.c'" '(should have been 542 characters)'
fi
chmod 644 ygtnm.c
fi
if test -f 'yskpcm.c'
then
echo shar: will not over-write existing "'yskpcm.c'"
else
echo extracting "'yskpcm.c'"
sed 's/^X//' >yskpcm.c <<'SHAR_EOF'
X#include "y2.h"
X
Xskipcom()
X{
X /* skip over comments */
X register c, i; /* i is the number of lines skipped */
X i = 0; /*01*/
X /* skipcom is called after reading a / */
X
X if ( unix_getc(finput) != '*' )
X error( "illegal comment" );
X c = unix_getc(finput);
X while ( c != EOF ) {
X while ( c == '*' ) {
X if ( (c = unix_getc(finput)) == '/' )
X return( i );
X }
X if ( c == '\n' )
X ++i;
X c = unix_getc(finput);
X }
X error( "EOF inside comment" );
X /* NOTREACHED */
X}
X
X
SHAR_EOF
if test 532 -ne "`wc -c < 'yskpcm.c'`"
then
echo shar: error transmitting "'yskpcm.c'" '(should have been 532 characters)'
fi
chmod 644 yskpcm.c
fi
if test -f 'yosmry.c'
then
echo shar: will not over-write existing "'yosmry.c'"
else
echo extracting "'yosmry.c'"
sed 's/^X//' >yosmry.c <<'SHAR_EOF'
X#include "y4.h"
X
X/*
X * Write summary.
X */
X
Xosummary()
X
X{
X register int i, *p;
X
X if (foutput == NULL)
X return;
X
X i = 0;
X for (p = maxa; p >= a; --p) {
X
X if (*p == 0)
X ++i;
X }
X fprintf(foutput, "Optimizer space used: input %d/%d, output %d/%d\n",
X pmem - mem0 + 1, MEMSIZE, maxa - a + 1, ACTSIZE);
X fprintf(foutput, "%d table entries, %d zero\n", (maxa - a) + 1, i);
X fprintf(foutput, "maximum spread: %d, maximum offset: %d\n", maxspr, maxoff);
X fclose(foutput);
X}
X
X
SHAR_EOF
if test 476 -ne "`wc -c < 'yosmry.c'`"
then
echo shar: error transmitting "'yosmry.c'" '(should have been 476 characters)'
fi
chmod 644 yosmry.c
fi
if test -f 'y4imp.c'
then
echo shar: will not over-write existing "'y4imp.c'"
else
echo extracting "'y4imp.c'"
sed 's/^X//' >y4imp.c <<'SHAR_EOF'
X/*
X * y4imp.c - impure data from y4.c modules
X *
X * HISTORY
X */
X
X# include "dtxtrn.h"
X
X# define a amem
X# define pa indgo
X# define yypact temp1
X# define greed tystate
X
X# define NOMORE -1000
X
Xint *ggreed = lkst[0].lset;
Xint *pgo = wsets[0].ws.lset;
Xint *yypgo = &nontrst[0].tvalue;
X
Xint maxspr = 0; /* maximum spread of any entry */
Xint maxoff = 0; /* maximum offset into a array */
Xint *pmem = mem0;
Xint *maxa;
Xint nxdb = 0;
Xint adb = 0;
SHAR_EOF
if test 440 -ne "`wc -c < 'y4imp.c'`"
then
echo shar: error transmitting "'y4imp.c'" '(should have been 440 characters)'
fi
chmod 644 y4imp.c
fi
if test -f 'ynxti.c'
then
echo shar: will not over-write existing "'ynxti.c'"
else
echo extracting "'ynxti.c'"
sed 's/^X//' >ynxti.c <<'SHAR_EOF'
X#include "y4.h"
X
Xnxti()
X{
X /* finds the next i */
X register i, max, maxi;
X
X max = 0;
X
X for ( i = 1; i <= nnonter; ++i )
X if ( ggreed[i] >= max ) {
X max = ggreed[i];
X maxi = -i;
X }
X
X for ( i = 0; i < nstate; ++i )
X if ( greed[i] >= max ) {
X max = greed[i];
X maxi = i;
X }
X
X if ( nxdb )
X fprintf( ftable, "nxti = %d, max = %d\n", maxi, max );
X if ( max == 0 )
X return( NOMORE );
X else
X return( maxi );
X}
X
X
SHAR_EOF
if test 423 -ne "`wc -c < 'ynxti.c'`"
then
echo shar: error transmitting "'ynxti.c'" '(should have been 423 characters)'
fi
chmod 644 ynxti.c
fi
if test -f 'ychfnd.c'
then
echo shar: will not over-write existing "'ychfnd.c'"
else
echo extracting "'ychfnd.c'"
sed 's/^X//' >ychfnd.c <<'SHAR_EOF'
X/*
X * ychfnd.c -
X *
X * HISTORY
X */
X
X#include "y2.h"
X
X
Xint chfind( t, s )
Xregister char *s;
X{
X int i;
X
X if (s[0] == ' ')
X t = 0;
X TLOOP(i) {
X if (!strcmp(s, tokset[i].name)) {
X return (i);
X }
X }
X NTLOOP(i) {
X if (!strcmp(s, nontrst[i].name)) {
X return (i + NTBASE);
X }
X }
X /* cannot find name */
X if (t > 1)
X error("%s should have been defined earlier", s);
X return (defin(t, s));
X}
X
X
SHAR_EOF
if test 394 -ne "`wc -c < 'ychfnd.c'`"
then
echo shar: error transmitting "'ychfnd.c'" '(should have been 394 characters)'
fi
chmod 644 ychfnd.c
fi
if test -f 'yyless.c'
then
echo shar: will not over-write existing "'yyless.c'"
else
echo extracting "'yyless.c'"
sed 's/^X//' >yyless.c <<'SHAR_EOF'
Xyyless(x)
X
X{
X extern char yytext[];
X register char *lastch, *ptr;
X extern int yyleng;
X extern int yyprevious;
X lastch = yytext + yyleng;
X if (x >= 0 && x <= yyleng)
X ptr = x + yytext;
X else
X ptr = x;
X while (lastch > ptr)
X yyunput(*--lastch);
X *lastch = 0;
X if (ptr > yytext)
X yyprevious = *--lastch;
X yyleng = ptr - yytext;
X}
X
X
SHAR_EOF
if test 333 -ne "`wc -c < 'yyless.c'`"
then
echo shar: error transmitting "'yyless.c'" '(should have been 333 characters)'
fi
chmod 644 yyless.c
fi
if test -f 'yarout.c'
then
echo shar: will not over-write existing "'yarout.c'"
else
echo extracting "'yarout.c'"
sed 's/^X//' >yarout.c <<'SHAR_EOF'
X/*
X * yarout.c -
X *
X * HISTORY
X */
X
X#include "y4.h"
X
Xint arout(s, v, n)
Xchar *s;
Xint *v, n;
X{
X register i;
X
X fprintf(ftable, "short %s[]={\n", s);
X for (i = 0; i < n; ) {
X if (i % 10 == 0)
X fprintf(ftable, "\n");
X fprintf(ftable, "%4d", v[i]);
X if (++i == n)
X fprintf(ftable, " };\n");
X else
X fprintf(ftable, ",");
X }
X}
X
X
SHAR_EOF
if test 333 -ne "`wc -c < 'yarout.c'`"
then
echo shar: error transmitting "'yarout.c'" '(should have been 333 characters)'
fi
chmod 644 yarout.c
fi
if test -f 'yerror.c'
then
echo shar: will not over-write existing "'yerror.c'"
else
echo extracting "'yerror.c'"
sed 's/^X//' >yerror.c <<'SHAR_EOF'
X#include "y1.h"
X
X/*
X * 12-Apr-83 (RBD) Add symbolic exit status
X */
X/* VARARGS1 */
Xerror(s, a1)
Xchar *s;
X
X{
X /* write out error comment */
X
X ++nerrors;
X fprintf( stderr, "\n fatal error: ");
X fprintf( stderr, s, a1);
X fprintf( stderr, ", line %d\n", lineno );
X if ( !fatfl )
X return;
X summary();
X exit(EX_ERR);
X}
X
X
SHAR_EOF
if test 318 -ne "`wc -c < 'yerror.c'`"
then
echo shar: error transmitting "'yerror.c'" '(should have been 318 characters)'
fi
chmod 644 yerror.c
fi
if test -f 'ywarry.c'
then
echo shar: will not over-write existing "'ywarry.c'"
else
echo extracting "'ywarry.c'"
sed 's/^X//' >ywarry.c <<'SHAR_EOF'
X#include "y3.h"
X
Xwarray( s, v, n )
Xchar *s;
Xint *v, n;
X
X{
X
X register i;
X
X fprintf( ftable, "short %s[]={\n", s );
X for ( i = 0; i < n; ) {
X if ( i % 10 == 0 )
X fprintf( ftable, "\n" );
X fprintf( ftable, "%4d", v[i] );
X if ( ++i == n )
X fprintf( ftable, " };\n" );
X else
X fprintf( ftable, "," );
X }
X}
X
X
SHAR_EOF
if test 316 -ne "`wc -c < 'ywarry.c'`"
then
echo shar: error transmitting "'ywarry.c'" '(should have been 316 characters)'
fi
chmod 644 ywarry.c
fi
if test -f 'yfdtyp.c'
then
echo shar: will not over-write existing "'yfdtyp.c'"
else
echo extracting "'yfdtyp.c'"
sed 's/^X//' >yfdtyp.c <<'SHAR_EOF'
X#include "y2.h"
X
Xfdtype( t )
X{
X /* determine the type of a symbol */
X register v;
X if ( t >= NTBASE )
X v = nontrst[t-NTBASE].tvalue;
X else
X v = TYPE( toklev[t] );
X if ( v <= 0 )
X error( "must specify type for %s", (t >= NTBASE) ? nontrst[t-NTBASE].name :
X tokset[t].name );
X return( v );
X}
X
X
SHAR_EOF
if test 304 -ne "`wc -c < 'yfdtyp.c'`"
then
echo shar: error transmitting "'yfdtyp.c'" '(should have been 304 characters)'
fi
chmod 644 yfdtyp.c
fi
if test -f 'yprlok.c'
then
echo shar: will not over-write existing "'yprlok.c'"
else
echo extracting "'yprlok.c'"
sed 's/^X//' >yprlok.c <<'SHAR_EOF'
X#include "y1.h"
X
Xprlook( p )
Xstruct looksets *p;
X
X{
X register j, *pp;
X pp = p->lset;
X if ( pp == 0 )
X fprintf( foutput, "\tNULL");
X else {
X fprintf( foutput, " { " );
X TLOOP(j)
X {
X if ( BIT(pp, j) )
X fprintf( foutput, "%s ", symnam(j) );
X }
X fprintf( foutput, "}" );
X }
X}
X
X
SHAR_EOF
if test 296 -ne "`wc -c < 'yprlok.c'`"
then
echo shar: error transmitting "'yprlok.c'" '(should have been 296 characters)'
fi
chmod 644 yprlok.c
fi
if test -f 'ystuni.c'
then
echo shar: will not over-write existing "'ystuni.c'"
else
echo extracting "'ystuni.c'"
sed 's/^X//' >ystuni.c <<'SHAR_EOF'
X#include "y1.h"
X
Xsetunion( a, b )
Xregister *a, *b;
X
X{
X /* set a to the union of a and b */
X /* return 1 if b is not a subset of a, 0 otherwise */
X register i, x, sub;
X
X sub = 0;
X SETLOOP(i)
X {
X *a = (x = *a) | *b++;
X if ( *a++ != x )
X sub = 1;
X }
X return( sub );
X}
X
X
SHAR_EOF
if test 274 -ne "`wc -c < 'ystuni.c'`"
then
echo shar: error transmitting "'ystuni.c'" '(should have been 274 characters)'
fi
chmod 644 ystuni.c
fi
if test -f 'yaoput.c'
then
echo shar: will not over-write existing "'yaoput.c'"
else
echo extracting "'yaoput.c'"
sed 's/^X//' >yaoput.c <<'SHAR_EOF'
X/*
X * yaoput.c - write out the optimized parser
X *
X * HISTORY
X */
X
X#include "y4.h"
X
Xint aoutput()
X{
X fprintf(ftable, "# define YYLAST %d\n", maxa - a + 1);
X arout("yyact", a, (maxa - a) + 1);
X arout("yypact", pa, nstate);
X arout("yypgo", pgo, nnonter + 1);
X}
X
X
SHAR_EOF
if test 261 -ne "`wc -c < 'yaoput.c'`"
then
echo shar: error transmitting "'yaoput.c'" '(should have been 261 characters)'
fi
chmod 644 yaoput.c
fi
if test -f 'y3imp.c'
then
echo shar: will not over-write existing "'y3imp.c'"
else
echo extracting "'y3imp.c'"
sed 's/^X//' >y3imp.c <<'SHAR_EOF'
X/*
X * y3imp.c - impure data from modules split from y3.c
X *
X * HISTORY
X */
X
X#define y3imp YES
X
X#include "dtxtrn.h"
X
Xint lastred; /* the number of the last reduction of a state */
X
Xint defact[NSTATES]; /* the default actions of states */
SHAR_EOF
if test 253 -ne "`wc -c < 'y3imp.c'`"
then
echo shar: error transmitting "'y3imp.c'" '(should have been 253 characters)'
fi
chmod 644 y3imp.c
fi
if test -f 'ycstsh.c'
then
echo shar: will not over-write existing "'ycstsh.c'"
else
echo extracting "'ycstsh.c'"
sed 's/^X//' >ycstsh.c <<'SHAR_EOF'
X#include "y2.h"
Xchar *
Xcstash( s )
Xregister char *s;
X
X{
X char *temp;
X
X temp = cnamp;
X do
X {
X if ( cnamp >= &cnames[cnamsz] )
X error("too many characters in id's and literals" );
X else
X *cnamp++ = *s;
X } while ( *s++);
X return( temp );
X}
X
X
SHAR_EOF
if test 250 -ne "`wc -c < 'ycstsh.c'`"
then
echo shar: error transmitting "'ycstsh.c'" '(should have been 250 characters)'
fi
chmod 644 ycstsh.c
fi
if test -f 'ysmnam.c'
then
echo shar: will not over-write existing "'ysmnam.c'"
else
echo extracting "'ysmnam.c'"
sed 's/^X//' >ysmnam.c <<'SHAR_EOF'
X#include "y1.h"
X
Xchar *symnam(i)
X{
X /* return a pointer to the name of symbol i */
X char *cp;
X
X cp = (i >= NTBASE) ? nontrst[i-NTBASE].name : tokset[i].name ;
X if ( *cp == ' ' )
X ++cp;
X return( cp );
X}
X
X
SHAR_EOF
if test 206 -ne "`wc -c < 'ysmnam.c'`"
then
echo shar: error transmitting "'ysmnam.c'" '(should have been 206 characters)'
fi
chmod 644 ysmnam.c
fi
if test -f 'yaryfl.c'
then
echo shar: will not over-write existing "'yaryfl.c'"
else
echo extracting "'yaryfl.c'"
sed 's/^X//' >yaryfl.c <<'SHAR_EOF'
X/*
X * yaryfl.c - set elements 0 through n-1 to c
X *
X * HISTORY
X */
X
X#include "y1.h"
X
X
Xint aryfil(v, n, c)
Xint *v, n, c;
X{
X register int i;
X
X for (i = 0; i < n; ++i)
X v[i] = c;
X}
X
X
SHAR_EOF
if test 182 -ne "`wc -c < 'yaryfl.c'`"
then
echo shar: error transmitting "'yaryfl.c'" '(should have been 182 characters)'
fi
chmod 644 yaryfl.c
fi
if test -f 'ychcpy.c'
then
echo shar: will not over-write existing "'ychcpy.c'"
else
echo extracting "'ychcpy.c'"
sed 's/^X//' >ychcpy.c <<'SHAR_EOF'
X/*
X * ychcpy.c - copies string q into p, return next free char ptr
X *
X * HISTORY
X */
X
X#include "y1.h"
X
Xchar *chcopy(p, q)
Xchar *p, *q;
X{
X while (*p = *q++)
X ++p;
X return (p);
X}
X
X
SHAR_EOF
if test 180 -ne "`wc -c < 'ychcpy.c'`"
then
echo shar: error transmitting "'ychcpy.c'" '(should have been 180 characters)'
fi
chmod 644 ychcpy.c
fi
if test -f 'yfnact.c'
then
echo shar: will not over-write existing "'yfnact.c'"
else
echo extracting "'yfnact.c'"
sed 's/^X//' >yfnact.c <<'SHAR_EOF'
X#include "y2.h"
X
Xfinact()
X{
X /* finish action routine */
X
X fclose(faction);
X
X fprintf( ftable, "# define YYERRCODE %d\n", tokset[2].value );
X
X}
X
X
SHAR_EOF
if test 146 -ne "`wc -c < 'yfnact.c'`"
then
echo shar: error transmitting "'yfnact.c'" '(should have been 146 characters)'
fi
chmod 644 yfnact.c
fi
# end of shell archive
exit 0
More information about the Comp.sources.unix
mailing list