This commit is contained in:
Oliver Lehmann 1990-01-25 05:31:00 +00:00
parent fcc2546ac7
commit eefa54f77f
3 changed files with 571 additions and 0 deletions

View File

@ -0,0 +1,94 @@
/* CONSTANTS.H -- manifest constants, operand and operator codes */
/* */
/* Defines: */
/* op_codes for operands */
/* Opflag's domain set */
/* Type_spec's domain set */
/* Manifest constants used throughout EQL */
# define CONTINUE 1 /* "loop" flag for yylex */
# ifdef MAXNAME
# undef MAXNAME
# endif
# define MAXNAME 13 /* maximum length for EQL */
/* identifiers (or keywords) */
# define MAXSTRING 255 /* maximum length for EQL strings */
# define FILLCNT 110 /* length to fill lines */
/* when in Fillmode */
/* debugging info conditional compilation flag */
# define xDEBUG /* on for "-c" and "-v" flags */
/* Character types [cmap.c] */
# define EOF_TOK 0 /* end of parse input too */
# define ALPHA 1 /* alphabetic or '_' */
# define NUMBR 2 /* numeric */
# define OPATR 3 /* other non control characters */
# define PUNCT 4 /* white space */
# define CNTRL 5 /* control-characters */
/* Modes used in parser actions to distinguish contexts in which */
/* the same syntax applies. Opflag is set to these modes. */
/* */
/* (There are some modes that are never referenced, but are useful */
/* for extension). */
/* QL statements */
# define mdAPPEND 1
# define mdCOPY 2
# define mdCREATE 3
# define mdDEFINE 4
# define mdDELETE 5
# define mdDESTROY 6
# define mdHELP 7
# define mdINDEX 8
# define mdINTEGRITY 9
# define mdMODIFY 10
# define mdPRINT 11
# define mdRANGE 12
# define mdREPLACE 13
# define mdRETRIEVE 14
# define mdSAVE 15
# define mdVIEW 16
# define mdPROT 17
/* statements particular to EQL */
# define mdDECL 16 /* C - declaration */
# define mdCTLELM 17 /* left hand side of target list */
/* element in "retrieve" to C-vars */
# define mdEXIT 18 /* ## exit */
# define mdDBS 19 /* ## dbs */
# define mdTUPRET 20 /* "retrieve" w/o an "into" */
# define mdFILENAME 21 /* used in "copy" statement */
/* define typTYPE xx */ /* c types "Type_spec" */
# define opINT 1
# ifndef NO_F4
# define opFLT 2
# endif
# define opSTRING 3
# define opDOUBLE 4
# define opCHAR 5
# define opLONG 6
# define opIDSTRING 7
# define opSTRUCT 8
/* define typALLOC xx */ /* c var allocation types */
# define opAUTO 0
# define opSTATIC 1
# define opEXTERN 2
# define opREGISTER 3

View File

@ -0,0 +1,165 @@
/* GLOBALS.H -- EQL declarations */
/* */
/* Defines: */
/* Structures and variables */
/* used in EQL. */
/* Structure declarations */
/* parser keyword and operator table node */
struct optab
{
char *op_term; /* pointer to terminal */
int op_token; /* lexical token */
int op_code; /* code to distinguish different op_terms */
/* with the same .op_token */
};
/* C variable tree node */
struct cvar
{
char *c_id; /* identifier */
char c_type; /* type */
char c_indir; /* indirection level */
/* (- 1 for strings) */
struct cvar *c_left; /* < sub-tree */
struct cvar *c_right; /* > sub-tree */
};
/* Display structures (linked list of strings) */
struct disp_node
{
char *d_elm; /* display element */
struct disp_node *d_next; /* next node */
int d_line; /* for Symsp nodes, line */
/* where lexeme was seen */
};
struct display
{
struct disp_node *disp_first; /* first node in display */
struct disp_node *disp_last; /* last node in display */
};
/* Retrieval list */
struct ret_var
{
char *r_elm; /* string invoking variable */
/* e.g. "*intpa [2]" */
struct ret_var *r_next; /* next variable used in "tupret" */
char r_type; /* type of variable */
};
struct ret_list
{
struct ret_var *ret_first; /* first node in ret_var chain */
struct ret_var *ret_last; /* last node in chain */
};
/* "# include" file processing stack (list) */
struct inc_file
{
int inc_yyline; /* old file's yyline */
int inc_lineout; /* " " Lineout */
char *inc_fid; /* name */
FILE *inc_infile; /* In_file */
FILE *inc_outfile; /* Out_file */
struct inc_file *inc_next;
# ifdef SETBUF
char *inc_ibuf; /* Ibuf */
# endif
};
/* Structure for yacc generated terminal codes */
/* This avoids having to include functions in */
/* [grammar.y] for the function to know the */
/* parser generated token numbers. */
struct special
{
int sp_name; /* NAME */
int sp_sconst; /* SCONST */
int sp_i2const; /* I2CONST */
int sp_i4const; /* I4CONST */
int sp_f8const; /* F8CONST */
int sp_quote; /* QUOTE */
int sp_bgncmnt; /* BGNCMNT */
int sp_endcmnt; /* ENDCMNT */
int sp_c_code; /* C_CODE */
int sp_struct_var;
};
/* Global definitions */
extern int Opcode; /* op code to distinguis tokens */
extern int yychar; /* yacc input token */
extern int yyline; /* yacc external line counter */
extern char *yylval; /* yacc external stack variable */
extern int yydebug; /* set by "-y" command line arg, */
/* has yacc parser give details */
/* of parse */
extern int Newline; /* less than one token has been */
/* read from the input line, and */
/* yylex isn't sure yet whether it */
/* is C_CODE or not */
extern int Lineout; /* output line count */
extern int In_quote; /* set if inside an IIwrite("... */
extern char *Input_file_name; /* input file name */
extern int C_code_flag; /* set to indicate C-code in parser */
extern int Pre_proc_flag; /* set to indicate a */
/* pre-processor line */
extern int Block_level; /* > 0 local, 0 global */
extern int Indir_level; /* holds indirection level */
/* of a reference to a C-var */
extern int In_string; /* set if output is in a string */
extern int Fillmode; /* set if output line being filled */
extern short Fillcnt; /* count to fill a line to */
extern int Charcnt; /* # chars written onto output line */
extern int Rtdb; /* set by "-d" command line arg, */
/* supplies EQL runtime support */
/* with info to report file name */
/* and line number in case of an */
/* error */
extern int Kwrdnum; /* # of entries in Kwrdtab tokens.y */
extern char Line_buf[]; /* buffer for input line */
extern char *Line_pos; /* position in input line */
extern struct optab Kwrdtab[]; /* table of key words [tokens.y] */
extern struct optab Optab[]; /* table of operators [tokens.y] */
extern struct special Tokens; /* holds yacc generated lex codes */
/* [tokens.y] */
extern struct cvar *C_globals; /* Global C-variable tree */
extern struct cvar *C_locals; /* Local C-variable tree */
extern struct cvar *F_globals; /* Global structure fields */
extern struct cvar *F_locals; /* Local structure fields */
extern struct display *Cv_display; /* display into which "cvarx"'s */
/* get put */
extern struct inc_file *Inc_file; /* file stack pushed by #includes */
/* I/O manipulation data structures */
extern FILE *In_file; /* input file */
extern FILE *Out_file; /* output file */
# ifdef SETBUF
extern char *Ibuf; /* input buffer */
extern char Out_buf[]; /* buffer for Out_file */
# endif
/* character type mapping */
# define ASCII_MASK 0177
# define BYTE_MASK 0377
extern char Cmap[];
# ifdef EBCDIC
# ifdef ESER_PSU
extern char _etoa_[];
# define ETOA(c) _etoa_[(c) & BYTE_MASK]
# endif
# define CMAP(c) Cmap[(ETOA(c)) & ASCII_MASK]
# else
# define CMAP(c) Cmap[(c) & ASCII_MASK]
# endif
# ifdef xDEBUG
extern char Lex_debug; /* debugging info for lexemes in */
/* yylex() [yylex.c] */
extern char Chardebug; /* print debugging info for routine */
/* in getch.c */
# endif

View File

@ -0,0 +1,312 @@
# include <stdio.h>
# include "gen.h"
# include "../h/bs.h"
# include "constants.h"
# include "globals.h"
# include "cmap.c"
# ifdef P8000
ret_buf AAjmp_buf;
# else
jmp_buf AAjmp_buf;
# endif
int Opcode; /* op code to distinguis tokens */
int Newline; /* less than one token has been */
int Lineout; /* output line count */
int In_quote; /* set if inside an IIwrite("... */
char *Input_file_name; /* input file name */
int C_code_flag; /* set to indicate C-code in parser */
int Pre_proc_flag; /* set to indicate a */
/* pre-processor line */
int Block_level; /* > 0 local, 0 global */
int Indir_level; /* holds indirection level */
/* of a reference to a C-var */
int In_string; /* set if output is in a string */
int Fillmode; /* set if output line being filled */
int Charcnt; /* # chars written onto output line */
int Rtdb; /* set by "-d" command line arg, */
/* supplies EQL runtime support */
/* with info to report file name */
/* and line number in case of an */
/* error */
FILE *In_file; /* input file */
FILE *Out_file; /* output file */
# ifdef SETBUF
char *Ibuf; /* input buffer */
char Out_buf[BUFSIZ]; /* buffer for Out_file */
# endif
struct cvar *C_globals; /* Global C-variable tree */
struct cvar *C_locals; /* Local C-variable tree */
struct cvar *F_globals; /* Global structure fields */
struct cvar *F_locals; /* Local structure fields */
# ifdef xDEBUG
char Lex_debug; /* debugging info for lexemes in */
/* yylex() [yylex.c] */
char Chardebug; /* print debugging info for routine */
/* in getch.c */
# endif
static int Arg_error; /* set in argproc() [main.c] on */
/* error in prcessing command line */
/* arguments. */
/*
** MAIN.C -- Start up routines
**
** Usage:
** eql {-d | -v | -c | -y | -f | -f<integer> | <name>.q}
**
** Files:
** standard output -- for diagnostics
** <name>.q -- read
** <name>.c -- created and written
** any file appearing in a "#include" with a name
** <name>.q.h -- read
** <name>.c.h -- created and written
**
** Flags:
** possible arguments are:
** -d -- enables run-time errors to have the file name
** and line number where they occurred reported
** Defaults to off.
** -f -- specify the number of characters to fill
** an output line on QL commands
** as being very high (to get C code on the
** right line invariably).
** -f<integer> -- fill output lines to integer chars
** (0 is like -f alone)
** Defaults to FILLCNT.
** -y -- have the parser print debugging info
** Defaults to off.
** -v -- (verbose) have the lexical analizer
** print the kind of token it sees.
** (only available if xDEBUG is defined)
** Defaults to off.
** -c -- have every character read or backed up
** echoed (only if xDEBUG is defined)
** Defaults to off.
** -r -- reset all previous flags to default
** <name>.q -- name of a file to be EQL'ed
**
** Defines:
** main()
** argproc()
** eql()
*/
char *AApath;
/*
** MAIN -- invokes the pre-compiler on all the argument files
**
** Parameters:
** argc
** argv
**
*/
main(argc, argv)
int argc;
char **argv;
{
extern char **argproc();
argv[argc] = 0;
for (argv++; *argv; )
{
argv = argproc(argv);
if (!Arg_error)
{
printf("%s :\n", Input_file_name);
eql(Input_file_name);
sync();
}
}
fflush(stdout);
exit(0);
}
/*
** ARGPROC -- process arguments on the command line
** Arguments have effect on all the files following them
** until a "-r" or an argument cancelling the first
**
** Also performs global initializations.
**
** Parameters:
** argv -- a 0 terminated string vector with the
** command lines components.
**
** Returns:
** a new argv with all the leading arguments taken out
**
** Side Effects:
** sets certain variables for certain flags
** -d -- Rtdb
** -c -- Chardebug
** -v -- Lex_debug
** -y -- yydebug
** -f -- Fillcnt
** -r -- resets all variables to default values
** Sets Arg_error on an argument error that should abort
** the pre-processing of the file read.
*/
char **argproc(argv)
register char **argv;
{
/* initializations for a new file */
C_code_flag = Pre_proc_flag = 0;
yyline = Newline = Lineout = 1;
Block_level = Indir_level = In_string = Fillmode = 0;
Charcnt = In_quote = 0;
Arg_error = 0;
/* free C variable trees, and symbol space */
freecvar(&C_locals);
freecvar(&F_locals);
freecvar(&C_globals);
freecvar(&F_globals);
symspfree();
for ( ; *argv && **argv == '-'; argv++)
{
switch (*++*argv)
{
# ifdef xDEBUG
case 'V':
case 'v':
Lex_debug = 'v';
break;
case 'C':
case 'c':
Chardebug = 'c';
break;
# endif
case 'Y':
case 'y':
yydebug = 1;
break;
case 'D':
case 'd':
Rtdb = 1;
break;
case 'F':
case 'f': /* line fill */
if (AA_atoi(++*argv, &Fillcnt))
printf("bad fill count \"%s\"\n",
*argv);
if (!Fillcnt)
/* make SURE that C_CODE is put
* on line that it was typed in on
*/
Fillcnt = 30000;
break;
case 'R':
case 'r': /* reset all flags to
* their default values.
*/
yydebug = Rtdb = 0;
Fillcnt = FILLCNT;
# ifdef xDEBUG
Lex_debug = Chardebug = 0;
# endif
break;
default :
printf("invalid option : '-%c'\n", **argv);
}
}
if (*argv)
Input_file_name = *argv++;
else
{
printf("missing file name after arguments\n");
Arg_error++;
}
return (argv);
}
/*
** EQL -- invokes the precompiler for a non-included file
**
** Parameters:
** filename -- the name of the file to pre-compile
**
** Side Effects:
** performs the preprocessing on <filename>
*/
eql(filename)
register char *filename;
{
register int l;
# ifdef SETBUF
char in_buf[BUFSIZ];
# endif
char o_file[100];
l = AAlength(filename);
if (l > sizeof o_file - 1)
{
printf("filename \"%s\" too long\n",
filename);
return;
}
if (!AAsequal(".q", &filename[l - 2]))
{
printf("invalid input file name \"%s\"\n",
filename);
return;
}
AAbmove(".c", AAbmove(filename, o_file, l - 2), 3);
Input_file_name = filename;
In_file = Out_file = (FILE *) 0;
# ifdef SETBUF
Ibuf = in_buf;
# endif
if (!(In_file = fopen(filename, "r")))
printf("can't read file \"%s\"\n", filename);
else if (!(Out_file = fopen(o_file, "w")))
printf("can't write file \"%s\"\n", o_file);
else
{
# ifdef SETBUF
setbuf(In_file, in_buf);
setbuf(Out_file, Out_buf);
# endif
setexit();
yyparse();
}
/* if a reset(3) is done while processing
* an included file, then this closes all
* files skipped.
*/
while (restoref())
continue;
if (Out_file)
fclose(Out_file);
if (In_file)
fclose(In_file);
In_file = Out_file = (FILE *) 0;
Input_file_name = 0;
if (Block_level)
printf("unclosed block\n");
}
AAunlall()
{
}