ING_DB
This commit is contained in:
parent
b992d20a86
commit
590be809a9
|
|
@ -0,0 +1,122 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "../h/dbs.h"
|
||||||
|
# include "../h/aux.h"
|
||||||
|
# include "constants.h"
|
||||||
|
# include "globals.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** NUMBER -- process a numeric token
|
||||||
|
** Number gets a number as, either floating or integer,
|
||||||
|
** with the QL format, from inside a QL statement,
|
||||||
|
** and adds it to the symbol space.
|
||||||
|
**
|
||||||
|
** Parameters:
|
||||||
|
** chr -- the first character of the number
|
||||||
|
**
|
||||||
|
** Returns:
|
||||||
|
** The lexical code for the appropriate
|
||||||
|
** type of number.
|
||||||
|
**
|
||||||
|
** Side Effects:
|
||||||
|
** Adds a token to the symbols space.
|
||||||
|
** yylval is set to the node added.
|
||||||
|
*/
|
||||||
|
number(chr)
|
||||||
|
register int chr;
|
||||||
|
{
|
||||||
|
register char *ptr;
|
||||||
|
register int toktyp;
|
||||||
|
double ftemp;
|
||||||
|
long ltemp;
|
||||||
|
char buf[MAXFIELD + 1];
|
||||||
|
extern char *yylval;
|
||||||
|
extern char *addsym();
|
||||||
|
extern char *salloc();
|
||||||
|
|
||||||
|
ptr = buf;
|
||||||
|
if ((*ptr = toktyp = chr) != '.')
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* get integer portion */
|
||||||
|
if ((ptr - buf) > MAXFIELD)
|
||||||
|
{
|
||||||
|
/* buffer overflow
|
||||||
|
* return integer 0,
|
||||||
|
* and signal error.
|
||||||
|
*/
|
||||||
|
bufovflo :
|
||||||
|
*ptr = '\0';
|
||||||
|
yysemerr("numeric too long", buf);
|
||||||
|
yylval = addsym("0");
|
||||||
|
return (Tokens.sp_i2const);
|
||||||
|
}
|
||||||
|
|
||||||
|
*++ptr = toktyp = getch();
|
||||||
|
} while (CMAP(toktyp) == NUMBR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do rest of type determination */
|
||||||
|
switch (toktyp)
|
||||||
|
{
|
||||||
|
case '.':
|
||||||
|
/* floating point */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* fill into ptr with up to next non-digit */
|
||||||
|
if ((ptr - buf) > MAXFIELD)
|
||||||
|
goto bufovflo;
|
||||||
|
*++ptr = toktyp = getch();
|
||||||
|
} while (CMAP(toktyp) == NUMBR);
|
||||||
|
if (toktyp != 'e' && toktyp != 'E')
|
||||||
|
{
|
||||||
|
backup(toktyp);
|
||||||
|
*ptr = '\0';
|
||||||
|
goto convr;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'e':
|
||||||
|
case 'E':
|
||||||
|
if ((ptr - buf) > MAXFIELD)
|
||||||
|
goto bufovflo;
|
||||||
|
*++ptr = toktyp = getch();
|
||||||
|
if (CMAP(toktyp) == NUMBR || toktyp == '-' || toktyp == '+')
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* get exponent */
|
||||||
|
if ((ptr - buf) > MAXFIELD)
|
||||||
|
goto bufovflo;
|
||||||
|
*++ptr = toktyp = getch();
|
||||||
|
} while (CMAP(toktyp) == NUMBR);
|
||||||
|
}
|
||||||
|
backup(toktyp);
|
||||||
|
*ptr = '\0';
|
||||||
|
convr:
|
||||||
|
if (AA_atof(buf, &ftemp))
|
||||||
|
{
|
||||||
|
/* floating conversion error */
|
||||||
|
yysemerr("numeric ofverflow", buf);
|
||||||
|
yylval = addsym("0");
|
||||||
|
return (Tokens.sp_f8const);
|
||||||
|
}
|
||||||
|
yylval = addsym(salloc(buf));
|
||||||
|
toktyp = Tokens.sp_f8const;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* integer */
|
||||||
|
backup(toktyp);
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
/* long conversion error */
|
||||||
|
if (AA_atol(buf, <emp) || ltemp > 32767 || ltemp < -32768)
|
||||||
|
goto convr;
|
||||||
|
yylval = addsym(salloc(buf));
|
||||||
|
toktyp = Tokens.sp_i2const;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (toktyp);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "constants.h"
|
||||||
|
# include "globals.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** OPERATOR -- process a token starting with an operator
|
||||||
|
**
|
||||||
|
** Processes operators, strings, comments, and
|
||||||
|
** floating constants without a leading 0.
|
||||||
|
**
|
||||||
|
** Parameters:
|
||||||
|
** chr - first character of token {CMAP(chr) == OPATR}
|
||||||
|
**
|
||||||
|
** Returns:
|
||||||
|
** NUMBER or STRING token, or operator token.
|
||||||
|
** CONTINUE on error.
|
||||||
|
**
|
||||||
|
** Side Effects:
|
||||||
|
** Adds a node to the Symbol space, and returns adress
|
||||||
|
** in "yylval".
|
||||||
|
** Opcode is set to the opcode of the operator.
|
||||||
|
** May backup a character.
|
||||||
|
*/
|
||||||
|
operator(chr)
|
||||||
|
register int chr;
|
||||||
|
{
|
||||||
|
register struct optab *op;
|
||||||
|
register int next_ch;
|
||||||
|
char opbuf[3];
|
||||||
|
extern char *yylval;
|
||||||
|
extern char *addsym();
|
||||||
|
|
||||||
|
opbuf[0] = chr;
|
||||||
|
opbuf[1] = next_ch = getch();
|
||||||
|
opbuf[2] = '\0';
|
||||||
|
|
||||||
|
if (opbuf[0] == '.' && CMAP(next_ch) == NUMBR)
|
||||||
|
{
|
||||||
|
/* floating mantissa w/o leading 0 */
|
||||||
|
backup(next_ch);
|
||||||
|
return (number(opbuf[0]));
|
||||||
|
}
|
||||||
|
if (CMAP(next_ch) != OPATR)
|
||||||
|
{
|
||||||
|
backup(next_ch);
|
||||||
|
opbuf[1] = '\0';
|
||||||
|
}
|
||||||
|
/* operator has been reduced to its smallest
|
||||||
|
* possible length, now try to find it in the
|
||||||
|
* operator table[tokens.y]
|
||||||
|
*/
|
||||||
|
for ( ; ; )
|
||||||
|
{
|
||||||
|
for (op = Optab; op->op_term; op++)
|
||||||
|
if (AAsequal(op->op_term, opbuf))
|
||||||
|
break;
|
||||||
|
if (!op->op_term && opbuf[1])
|
||||||
|
{
|
||||||
|
/* reduce a 2 char operator to 1 char,
|
||||||
|
* and re-search
|
||||||
|
*/
|
||||||
|
backup(opbuf[1]);
|
||||||
|
opbuf[1] = '\0';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (op->op_term)
|
||||||
|
{
|
||||||
|
/* string quotes ? */
|
||||||
|
if (op->op_token == Tokens.sp_quote)
|
||||||
|
return (string(op));
|
||||||
|
|
||||||
|
/* comment indicator ? */
|
||||||
|
if (op->op_token == Tokens.sp_bgncmnt)
|
||||||
|
return (comment());
|
||||||
|
|
||||||
|
/* {AAsequal(opbuf, op->op_term)} */
|
||||||
|
Opcode = op->op_code;
|
||||||
|
yylval = addsym(op->op_term);
|
||||||
|
return (op->op_token);
|
||||||
|
}
|
||||||
|
yysemerr("bad operator", opbuf);
|
||||||
|
|
||||||
|
/* operator not found, skip token and try again */
|
||||||
|
return (CONTINUE);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "constants.h"
|
||||||
|
# include "globals.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** STRING -- processes a string constant
|
||||||
|
** Strings are kept internally exactly as their external
|
||||||
|
** appearance, except for the outermost '"'.
|
||||||
|
** A string may be at most MAXSTRING characters
|
||||||
|
** long, and may have escaped newlines.
|
||||||
|
**
|
||||||
|
** Parameters:
|
||||||
|
** op -- pointer to string quote operator
|
||||||
|
** table entry.
|
||||||
|
**
|
||||||
|
** Returns:
|
||||||
|
** SCONST
|
||||||
|
*/
|
||||||
|
string(op)
|
||||||
|
struct optab *op;
|
||||||
|
{
|
||||||
|
char buf[MAXSTRING + 1];
|
||||||
|
register int c;
|
||||||
|
register char *cp;
|
||||||
|
register int escape;
|
||||||
|
register int error;
|
||||||
|
extern char *yylval;
|
||||||
|
extern char *addsym();
|
||||||
|
extern char *salloc();
|
||||||
|
|
||||||
|
error = escape = 0;
|
||||||
|
cp = buf;
|
||||||
|
for ( ; ; )
|
||||||
|
{
|
||||||
|
switch (c = getch())
|
||||||
|
{
|
||||||
|
case '\\' :
|
||||||
|
if (!escape)
|
||||||
|
escape = 2;
|
||||||
|
goto regchar;
|
||||||
|
|
||||||
|
case '\n' :
|
||||||
|
if (escape)
|
||||||
|
goto regchar;
|
||||||
|
*cp = '\0';
|
||||||
|
yysemerr("non-terminated string", !error? buf :(char *) 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EOF_TOK :
|
||||||
|
backup(c);
|
||||||
|
*cp = '\0';
|
||||||
|
yysemerr("EOF in string", !error? buf :(char *) 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
regchar :
|
||||||
|
if (c == *op->op_term && !escape)
|
||||||
|
{
|
||||||
|
/* end of string */
|
||||||
|
*cp = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
if (cp - buf < MAXSTRING)
|
||||||
|
{
|
||||||
|
if (CMAP(c) == CNTRL)
|
||||||
|
yysemerr("control character in string eliminated", (char *) 0);
|
||||||
|
else
|
||||||
|
*cp++ = c;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yysemerr("string too long, rest discarded", (char *) 0);
|
||||||
|
error = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (escape)
|
||||||
|
--escape;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
yylval = addsym(salloc(buf));
|
||||||
|
return (Tokens.sp_sconst);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,167 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "gen.h"
|
||||||
|
# include "constants.h"
|
||||||
|
# include "globals.h"
|
||||||
|
|
||||||
|
int yyline;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** YYLEX -- Lexical analyzer
|
||||||
|
** Yylex controls the return to the parser of lexemes,
|
||||||
|
** and the copying out of C_CODE on the all to yylex
|
||||||
|
** after yylex() returned the C_CODE.
|
||||||
|
**
|
||||||
|
** Returns:
|
||||||
|
** Lexical tokens.
|
||||||
|
**
|
||||||
|
** Side Effects:
|
||||||
|
** Copies C code out on call after seeing it.
|
||||||
|
** Puts terminals in symbol space.
|
||||||
|
*/
|
||||||
|
yylex()
|
||||||
|
{
|
||||||
|
register int rtval;
|
||||||
|
register int chr;
|
||||||
|
extern char *yysterm[];
|
||||||
|
|
||||||
|
/* get next token */
|
||||||
|
rtval = CONTINUE;
|
||||||
|
|
||||||
|
while (rtval == CONTINUE)
|
||||||
|
{
|
||||||
|
if (C_code_flag)
|
||||||
|
{
|
||||||
|
copy_c_code();
|
||||||
|
Newline = 1;
|
||||||
|
}
|
||||||
|
Pre_proc_flag = 0;
|
||||||
|
|
||||||
|
/* END OF FILE ? */
|
||||||
|
if ((chr = getch()) == EOF_TOK)
|
||||||
|
{
|
||||||
|
# ifdef xDEBUG
|
||||||
|
if (Lex_debug)
|
||||||
|
printf("end of file\n");
|
||||||
|
# endif
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test for a line of C code */
|
||||||
|
if (Newline && if_c_code(chr))
|
||||||
|
{
|
||||||
|
if (C_code_flag)
|
||||||
|
continue;
|
||||||
|
rtval = Tokens.sp_c_code;
|
||||||
|
C_code_flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
C_code_flag = 0;
|
||||||
|
if (Newline)
|
||||||
|
{
|
||||||
|
Newline = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CARRIAGE CONTROL ? */
|
||||||
|
Newline = chr == '\n';
|
||||||
|
|
||||||
|
switch (CMAP(chr))
|
||||||
|
{
|
||||||
|
|
||||||
|
case PUNCT :
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case OPATR :
|
||||||
|
rtval = operator(chr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NUMBR :
|
||||||
|
rtval = number(chr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ALPHA :
|
||||||
|
rtval = name(chr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Lex_debug)
|
||||||
|
printf("YYLEX : %s: '%s'\n", yysterm[rtval - 256],
|
||||||
|
yylval? ((struct disp_node *) yylval)->d_elm: "");
|
||||||
|
return (rtval);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** COPY_C_CODE -- Copies out a line of C code
|
||||||
|
** The test for Charcnt != 0 is beacuse if a C pre-processor
|
||||||
|
** line follows an EQL line, and equate_lines() puts out no
|
||||||
|
** newline, the initial '#' will not be on the beginning of
|
||||||
|
** the line. As is, if this should happen, then the line
|
||||||
|
** with the '#' will be one line in the output ahead of
|
||||||
|
** where it should be.
|
||||||
|
*/
|
||||||
|
copy_c_code()
|
||||||
|
{
|
||||||
|
register int c;
|
||||||
|
char ch[2];
|
||||||
|
|
||||||
|
ch[1] = 0;
|
||||||
|
equate_lines();
|
||||||
|
if (Pre_proc_flag)
|
||||||
|
{
|
||||||
|
if (Charcnt)
|
||||||
|
w_raw("\n");
|
||||||
|
w_raw("#");
|
||||||
|
}
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((c = getch()) == EOF_TOK)
|
||||||
|
return;
|
||||||
|
*ch = c;
|
||||||
|
w_raw(ch);
|
||||||
|
} while (*ch != '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** IF_C_CODE -- Test to see if a line is C code
|
||||||
|
**
|
||||||
|
** Sees if a line begins with "##" to see if it is EQL.
|
||||||
|
**
|
||||||
|
** Parameters:
|
||||||
|
** chr -- first char of line
|
||||||
|
**
|
||||||
|
** Returns:
|
||||||
|
** 0 -- QL line
|
||||||
|
** 1 -- C line
|
||||||
|
*/
|
||||||
|
if_c_code(chr)
|
||||||
|
register int chr;
|
||||||
|
{
|
||||||
|
for ( ; ; )
|
||||||
|
{
|
||||||
|
if (chr != '#')
|
||||||
|
{
|
||||||
|
backup(chr);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
Pre_proc_flag = 1;
|
||||||
|
if ((chr = getch()) == EOF_TOK)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (chr != '#')
|
||||||
|
{
|
||||||
|
backup(chr);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue