home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 11 Util
/
11-Util.zip
/
OS2_LEX.ZIP
/
OUT2.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-07
|
4KB
|
126 lines
/*
* out2.c -- Some of Lex's output routines for overlaying, moved
* here from the original out.c as part of size reduction
* effort.
* Bob Denny
* 03-Dec-80
* More...
* Bob Denny
* 29-May-81 RSX overlaying
* 19-Mar-82 Bob Denny -- New compiler and library
* 28-Aug-82 Bob Denny -- Change output format for readability. I know
* you UNIX hackers are not going to like this
* one. Add code to generate llstin() per
* setting of "-s" switch. Fix cclprint() to
* put 16 "characters" on a line. Clean up
* nfaprint().
* 29-Aug-82 Bob Denny -- Move chprint to root. Add llstin() to
* default lexin to stdin for standard I/O
* and no-op for stand-alone I/O. Allows
* sdtio-specific code to be removed from
* yylex().
* 31-Aug-82 Bob Denny -- Add lexswitch( ...) to llstin so table
* name selected by -t switch is automatically
* switched-to at yylex() startup time. Removed
* hard reference to "lextab" from yylex();
* 30-Oct-82 Bob Denny -- Remove lexswitch() from llstin(). Made it
* impossible to do a real lexswitch()! (dumb.)
* Default the table by statically initializing
* it to NULL and doing the lexswitch only if
* _tabp is NULL.
* 20-Nov-83 Scott Guthery -- Adapt for IBM PC & DeSmet C
*/
#include <stdio.h>
#include "lexlex.h"
#include "lextern.h"
extern int yyline;
void cclprint(char *);
#ifdef DEBUG
void nfaprint(struct nfa *np, struct nfa *base)
{
register i;
if (np->n_flag&NPRT)
return;
np->n_flag |= NPRT;
fprintf(lexlog, "state %d\n", np-base);
switch (np->n_char) {
case EPSILON:
for (i = 0; i < 2; i++)
if (np->n_succ[i])
fprintf(lexlog, "\tepsilon %d\n", np->n_succ[i]-base);
break;
case FIN:
fprintf(lexlog, "\tfinal state\n");
break;
case CCL:
fprintf(lexlog, "\t[");
cclprint(np->n_ccl);
fprintf(lexlog, "] %d\n", np->n_succ[0]-base);
break;
default:
putc('\t', lexlog);
chprint(np->n_char);
fprintf(lexlog, " %d\n", np->n_succ[0]-base);
break;
}
putc('\n', lexlog);
if (np->n_succ[0])
nfaprint(np->n_succ[0], base);
if (np->n_succ[1])
nfaprint(np->n_succ[1], base);
}
void cclprint(char *cp)
{
register i;
register nc;
nc = 0;
for (i = 0; i < NCHARS; i++)
{
if (cp[i / NBPC] & (1 << (i % NBPC)))
nc += chprint(i);
if(nc >= 64)
{
nc = 0;
fprintf(lexlog, "\n\t ");
}
}
}
#endif
void llactr(void)
{
/*
* Prior to generating the action routine, create
* the llstin() routine, which initializes yylex(),
* per the setting of the "-s" switch. All hardwired
* variables have now been removed from yylex(). This
* allows analyzers to be independent of the standard
* I/O library and the table name.
*/
fprintf(llout, "_A%s(__na__)\t\t/* Action routine */\n {\n", tabname);
}
void newcase(int i)
{
static int putsw;
if (!putsw++)
fprintf(llout, " switch (__na__)\n {\n");
fprintf(llout, "\n case %d:\n", i);
setline();
}
void setline(void)
{
fprintf(llout, "\n#line %d\n", yyline);
}