ING_DB
This commit is contained in:
parent
ad48565153
commit
61d1ec1ff6
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
** --- RC_GTCHR.C ------ SCANNER I/O ----------------------------------------
|
||||||
|
**
|
||||||
|
** GTCHAR
|
||||||
|
** If 'Lcase' is set, all upper-case alphabetics are
|
||||||
|
** mapped into lower-case.
|
||||||
|
** The correct return is > 0; a return = 0 indicates end-of-file.
|
||||||
|
**
|
||||||
|
** BACKUP
|
||||||
|
** Saves the character argument in the global stack 'Pchar'
|
||||||
|
**
|
||||||
|
** Version: @(#)rc_gtchr.c 4.0 02/05/89
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "rc.h"
|
||||||
|
|
||||||
|
/* INPUT FILE */
|
||||||
|
FILE *Input;
|
||||||
|
|
||||||
|
/* TWO CHARACTER STACK FOR 'UNGETC' BACKUP */
|
||||||
|
static char Pchar[2];
|
||||||
|
static int Pctr;
|
||||||
|
|
||||||
|
rc_gtchar()
|
||||||
|
{
|
||||||
|
register int chr;
|
||||||
|
|
||||||
|
/* USE STACKED CHARACTERS IF POSSIBLE */
|
||||||
|
if (Pctr)
|
||||||
|
chr = Pchar[--Pctr];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((chr = getc(Input)) <= 0)
|
||||||
|
chr = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (chr == '\n')
|
||||||
|
ungetc(chr = '\r', Input);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (chr != '\r')
|
||||||
|
{
|
||||||
|
if (!Iflag && Sflag)
|
||||||
|
putchar(chr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chr = '\n';
|
||||||
|
if (Sflag)
|
||||||
|
{
|
||||||
|
if (!Iflag)
|
||||||
|
putchar('\n');
|
||||||
|
fflush(stdout);
|
||||||
|
printf("%4d: ",Line+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* UPDATE LINE COUNTER */
|
||||||
|
if (chr == '\n')
|
||||||
|
Line++;
|
||||||
|
|
||||||
|
if (Lcase && ((chr >= 'A'
|
||||||
|
# ifdef EBCDIC
|
||||||
|
&& chr <= 'I') || (chr >= 'J'
|
||||||
|
&& chr <= 'R') || (chr >= 'S'
|
||||||
|
# endif
|
||||||
|
&& chr <= 'Z')))
|
||||||
|
chr += 'a' - 'A';
|
||||||
|
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_INPUT)
|
||||||
|
printf("GTCHAR: ret %c (0%o)\n", chr, chr);
|
||||||
|
# endif
|
||||||
|
return (chr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc_backup(chr)
|
||||||
|
register int chr;
|
||||||
|
{
|
||||||
|
if (Pctr == 2)
|
||||||
|
{
|
||||||
|
/* "BACKUP: overflow" */
|
||||||
|
rc_error(18);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Pchar[Pctr++] = chr;
|
||||||
|
if (chr == '\n')
|
||||||
|
Line--;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
** --- RC_LEX.C -------- SCANNER --------------------------------------------
|
||||||
|
**
|
||||||
|
** Each call to rc_lex() returns a token for the next
|
||||||
|
** syntactic unit. If the object is of type LCONST
|
||||||
|
** RCONST or SCONST that object will also be entered
|
||||||
|
** in the symbol table, indexed by `yylval'. If the
|
||||||
|
** object is not one of these types, `yylval' is the
|
||||||
|
** opcode field of the operator or keyword tables.
|
||||||
|
** The end_of_file `EOF' token is zero.
|
||||||
|
**
|
||||||
|
** Version: @(#)rc_lex.c 4.0 02/05/89
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
# include "rc.h"
|
||||||
|
|
||||||
|
rc_lex()
|
||||||
|
{
|
||||||
|
register int chr;
|
||||||
|
register int rtval;
|
||||||
|
|
||||||
|
rtval = -1;
|
||||||
|
|
||||||
|
do /* GET NEXT TOKEN */
|
||||||
|
{
|
||||||
|
if (!(chr = rc_gtchar()))
|
||||||
|
{
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("YYLEX: EOF\n");
|
||||||
|
# endif
|
||||||
|
rtval = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (CMAP(chr))
|
||||||
|
{
|
||||||
|
case ALPHA:
|
||||||
|
rtval = rc_name(chr);
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("YYLEX: name ret %d\n", rtval);
|
||||||
|
# endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NUMBR:
|
||||||
|
rtval = rc_number(chr);
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("YYLEX: number ret %d\n", rtval);
|
||||||
|
# endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPATR:
|
||||||
|
if (!(rtval = rc_operator(chr)))
|
||||||
|
rtval = -1;
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("YYLEX: operator ret %d\n", rtval);
|
||||||
|
# endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CNTRL:
|
||||||
|
printf("<\\0%o>", chr);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case PUNCT:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} while (rtval == -1);
|
||||||
|
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("YYLEX: ret %d\n", rtval);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return (rtval);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
** --- RC_STR.C -------- STRING CONSTANT SCANNER ----------------------------
|
||||||
|
**
|
||||||
|
** A string is defined as any sequence of MAX_FIELD or fewer characters,
|
||||||
|
** surrounded by string delimiters. New-line ;characters are purged
|
||||||
|
** from strings unless preceeded by a '\'; QUOTE's must be similarly
|
||||||
|
** prefixed in order to be correctly inserted within a string. Each
|
||||||
|
** string is entered in the symbol table, indexed by 'yylval'. A
|
||||||
|
** token or the error condition -1 is returned.
|
||||||
|
**
|
||||||
|
** Version: @(#)rc_str.c 4.0 02/05/89
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
# include "rc.h"
|
||||||
|
|
||||||
|
|
||||||
|
rc_string(op)
|
||||||
|
struct optab *op;
|
||||||
|
{
|
||||||
|
register int esc;
|
||||||
|
register int toktyp;
|
||||||
|
register char *ptr;
|
||||||
|
register int save;
|
||||||
|
char buf[MAX_FIELD + 1];
|
||||||
|
extern char *rc_syment();
|
||||||
|
extern char *yylval;
|
||||||
|
|
||||||
|
/* disable case conversion and fill in string */
|
||||||
|
ptr = buf;
|
||||||
|
save = Lcase;
|
||||||
|
Lcase = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* get next character */
|
||||||
|
if (!(*ptr = rc_gtchar()))
|
||||||
|
{
|
||||||
|
/* non term string */
|
||||||
|
rc_error(11);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* handle escape characters */
|
||||||
|
esc = (*ptr == '\\');
|
||||||
|
if (*ptr == '\n')
|
||||||
|
{
|
||||||
|
if (!(*ptr = rc_gtchar()))
|
||||||
|
{
|
||||||
|
*ptr = 0;
|
||||||
|
/* non term string */
|
||||||
|
rc_error(11);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (esc == 1)
|
||||||
|
{
|
||||||
|
if (!(*++ptr = rc_gtchar()))
|
||||||
|
{
|
||||||
|
*ptr = 0;
|
||||||
|
/* non term string */
|
||||||
|
rc_error(11);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*ptr == *(op->term))
|
||||||
|
*--ptr = *(op->term);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check length */
|
||||||
|
if ((ptr - buf) > MAX_FIELD - 1)
|
||||||
|
{
|
||||||
|
/* string too long */
|
||||||
|
rc_error(12);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
toktyp = *ptr;
|
||||||
|
if (CMAP(toktyp) == CNTRL)
|
||||||
|
{
|
||||||
|
printf("<\\0%o>", *ptr);
|
||||||
|
*ptr = ' ';
|
||||||
|
}
|
||||||
|
} while (*ptr++ != *(op->term) || esc == 1);
|
||||||
|
|
||||||
|
/* restore case conversion and return */
|
||||||
|
*--ptr = '\0';
|
||||||
|
Lcase = save;
|
||||||
|
yylval = rc_syment(buf, (ptr - buf) + 1);
|
||||||
|
# ifdef RC_TRACE
|
||||||
|
if (TR_LEX)
|
||||||
|
printf("STRING: %s\n", yylval);
|
||||||
|
# endif
|
||||||
|
return (Tokens.sconst);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue