home *** CD-ROM | disk | FTP | other *** search
- /* (skel)decl.h
-
- QPARSER 4.0, QCAD Systems, Inc., San Jose, CA.
- This code may be reproduced, modified, or built into third party software
- in any way deemed suitable by the purchaser of the QPARSER product.
-
- General description:
-
- This skeleton file must be passed through lr1p with a suitable grammar
- file to generate a compilable C file, e.g. decls.h.
- It and its companion C and skeleton-C files are guaranteed to compile,
- link and execute correctly under the Microsoft C or Unix compilation
- environment. See the make file for your environment for more details:
-
- Microsoft: m
- Turbo: makefile.mak
- Unix: makefile
- Macintosh: ???
-
- The compiler directive MSDOS, TCC, or UNIX is
- required for the specific environment chosen. Don't specify more than
- one of these.
- Other environments or compilers may require modifications to this
- source code. Note that a modification to the skeleton and base C files
- will result in correct generated code for the new environment.
-
- */
-
- #ifndef DECL_H
- #define DECL_H
-
- #ifdef MSDOS
- #include <malloc.h>
- #endif
- #ifdef TCC
- #include <alloc.h>
- #endif
-
- #ifndef SETSIZE
- # include "sets.h"
- #endif
-
- #define SHOWLINES 18 /* how many lines to put on a screen before 'more' */
-
- #define HASHSIZE 167 /* number of symbol table hash buckets */
-
- /* definitions of base symbol table attributes.
- Additional attributes may be added as desired -- but also extend
- the corresponding array 'symtypenames' in skeltab.c, and
- the 'dump_sym' function in skeldbug.c !!! */
- #define RESERVED 0 /*reserved token*/
- #define SYMERR 1 /*error recovery symbol*/
- #define USER 2 /*unknown default*/
- #define INTVAR 3 /*integer type*/
- #define REALVAR 4 /*real type*/
- #define STRVAR 5 /*string type*/
- #define CHART 6 /*character type*/
-
- /* The DEBUG_CHAR is a character which, when inserted in the
- parser's source code, invokes Qparser debugging.
- Debugging is enabled by compiling with -DDEBUG */
-
- #define DEBUG_CHAR '!'
-
- typedef struct semrec_struct semrectype;
- typedef struct symtab_struct symtabtype;
-
- extern symtabtype *symtab[HASHSIZE];
-
- extern void inittables(); /* in qlex.c */
- extern int clevel; /* symbol entry level number: -1 == reserved tokens */
-
- /* call this once before commencing with symbol table building */
- extern void init_sym();
-
- /* findsym: find a symbol. Returns NULL if not in table */
- extern symtabtype *findsym( /* char *fsym */ );
-
- /* makesym returns a symbol entry if there; makes a new one if not.
- Useful for FORTRAN-style variable declaration -- declare name
- on first appearance, whether in a declaration or not.
- syt: symbol type
- */
- extern symtabtype *makesym( /* char *fsym; int syt */ );
-
- /* forcesym: forces a new symbol entry. Use this for declarations
- to cover a previous declaration with the same name. */
- extern symtabtype *forcesym( /* char *fsym; int syt */ );
-
- /* clearsym: sets the symbol table pointers to remove references to
- everything at level >= clevel, assuming that level numbers
- are monotonic. Frees memory space. */
- extern void clearsym( /* int clevel */ );
-
- /* shows all the symbols in the symbol table*/
- extern void dump_all();
-
- /* Semantics stuff */
-
- #define STACKSIZE 100 /*maximum size of stack*/
-
- extern int cstate; /* TOS state -- not in stack! */
- extern int stack[]; /* array of other states */
- extern int stackx; /* stack[stackx] is at the top of the stack */
- extern semrectype *semstack[]; /* semantics stack */
- extern int token, /* current token number */
- errpos, /* position of current token in input line */
- errors,
- err_count; /* if > 0, don't report syntax errors */
- extern semrectype *lsemp; /* holds current semantics element */
- extern semrectype *lsempary[2]; /* holds current and 'next ' element */
-
- /*Parser gen constants*/
- {##
- var K, IDENT_TOKLEN, MAXFLAGLEN: integer;
- begin
- indent:=0;
- ident_toklen:=15;
- writeln('#define IDENT_TOKLEN ',ident_toklen);
- if maxtoklen >ident_toklen then ident_toklen:=maxtoklen;
- writeln('#define MAXTOKLEN ',ident_toklen);
-
- maxflaglen:= 9; {the string length of "GENL_KIND", which counts as
- the longest predefined flag}
- for k:=ldim(flags) to udim(flags) do
- if maxflaglen < strlen(flags[k]) then
- maxflaglen:=strlen(flags[k]);
- writeln('#define MAXFLAGLEN ', maxflaglen);
- writeln('#define MAXRPLEN ', maxrplen);
- {length of longest production right member}
- writeln('#define MAXNRPLEN ', maxnrplen);
- {maximum nonterms in production right members}
- writeln('#define TERM_TOKS ', term_toks);
- { number of terminal tokens }
- writeln('#define NTERM_TOKS ', nterm_toks);
- { number of nonterminal tokens }
- writeln('#define ALL_TOKS ', term_toks+nterm_toks);
- { all tokens }
- writeln('#define IDENT_TOKX ', id_tokx);
- { token number of <identifier> }
- writeln('#define INT_TOKX ', int_tokx);
- { token number of <integer> }
- writeln('#define REAL_TOKX ', real_tokx);
- { token number of <real> }
- writeln('#define STR_TOKX ', str_tokx);
- { token number of <string> }
- writeln('#define CHAR_TOKX ', char_tokx);
- { token number of <character> }
- writeln('#define STOP_TOKX ', stop_tokx);
- { token number of stopsign (end-of-file) }
- writeln('#define GOAL_TOKX ', goal_tokx);
- { token number of goal }
- writeln('#define EOL_TOKX ', eol_tokx);
- { token number of end-of-line }
- writeln('#define REDUCELEN ', reducestate);
- { last reduce state }
- writeln('#define READSTATE ', readstate);
- { first READ state }
- writeln('#define LREADSTATE ', lookstate-1);
- { last READ state }
- writeln('#define LOOKSTATE ', lookstate);
- { first LOOK state }
- writeln('#define MAXSTATE ', maxstate);
- { largest state number }
- writeln('#define RLTOKENS ', udim(toknum));
- { dimension of TOKNUM array }
- writeln('#define SSTOKENS ', udim(stk_state));
- { dimension of ISTK_STATE array }
- writeln('#define PRODTOKS ', udim(prods));
- writeln('#define TOKCHARS ', term_chars
- +nterm_chars
- +all_toks);
- writeln('#define START_STATE ', start_state);
- { initial state }
- writeln('#define ISTK_STATE ', istk_state);
- { state initially pushed on stack }
-
- for k:=1 to term_toks do {wild tokens}
- if is_wild[k] then writeln('#define ', tokens[k], ' ', k);
- end;
- ##}
-
- /* reserved flags used in SEMREC stuff */
- #define OTHER 0
- #define FIRST_SEMTYPE OTHER
-
- #define SEMERR 1
- #define IDENT 2
- #define FIXED 3
- #define FLOAT 4
- #define STRNG 5
- #define CHAR 6
- #define GENL_KIND 7
- /* add more special semantic flags as needed here */
- #define OFFSET 8 /* one plus the previous flag */
-
- {## var K: integer;
- begin
- indent:= 0;
- writeln('#define FLAG_ARRAY_DIM (OFFSET+',
- udim(flags) - ldim(flags) + 1, ')');
- writeln('/* Production flags */');
- for k:=ldim(flags) to udim(flags) do
- writeln('#define ', flags[k], ' (OFFSET+', k-ldim(flags), ')');
- writeln('#define LAST_SEMTYPE (OFFSET+',
- udim(flags)-ldim(flags), ')');
- end; ##}
-
- /* node tracing set used by QTREES */
- #define TSETSIZE (SETSIZE(LAST_SEMTYPE+1))
- extern char trace_nodes[TSETSIZE];
-
- /* new_sem: allocates and partially initializes a semrectype */
- extern semrectype *new_sem( /* int semt, symt */ );
-
- /* these are standard definitions for Qtrees */
- #define POSITION(N) usem.position0[(N)-1]
- #define CHILD usem.position0[0]
- #define LEFT usem.position0[0]
- #define RIGHT usem.position0[1]
- #define ONE usem.position0[0]
- #define TWO usem.position0[1]
- #define THREE usem.position0[2]
- #define FOUR usem.position0[3]
- #define FIVE usem.position0[4]
-
- {## begin indent:=0;
- if defined(skeldecl) then writeln(skeldecl); end; ##}
-
- struct symtab_struct {
- symtabtype *next; /* linked list of symbols hashing to same bucket */
- int level; /* scope level: -1 is for reserved tokens, 0 global, etc.*/
- char *sym; /* the symbol referring to one of the following values */
- int symt; /* USER, INTVAR, REALVAR, etc. */
- union {
- int tokval; /* RESERVED */
- long int numval; /* INTVAR, CHART */
- double rval; /* REALVAR */
- char *strx; /* STRVAR */
- /* +++ add customization here; also extend these:
-
- FILE FUNCTION/VARIABLE
- -----------------------------------
- skeltab.c symtypenames
- skelsyms.c new_sym, printf_sym, free_symtab_item
- skeldbug.c dump_sym
-
- --- */
- {## begin indent:=4;
- if defined(symtab_union) then writeln(symtab_union); end; ##}
- } usym;
- };
-
- struct semrec_struct {
- int symt; /* type definition of this node: USER, INTVAR, REALVAR,
- STRVAR, etc. */
- int semt; /* semantics type: IDENT, FIXED, etc. */
- union {
- symtabtype *symp; /* IDENT */
- long int numval; /* FIXED, CHAR */
- double rval; /* FLOAT */
- char *strx; /* STRNG */
- /* +++ add customization here --- */
- {## begin indent:=4;
- if defined(semrec_union) then writeln(semrec_union); end; ##}
- semrectype *position0[MAXNRPLEN]; /* 0-based */
- } usem;
- };
-
- /* the all-important apply function */
-
- extern semrectype *apply( /* int cstate */ );
-
- /* the parser tables; these are in skeltab.c */
- extern short statex[];
- extern short map[];
- extern char popno[];
- extern short toknum[];
- extern short tostate[];
- extern short stk_state[];
- extern short stk_tostate[];
- extern short psmx[];
- extern char psmpos[];
- extern short prodx[];
- extern short prods[];
- extern short insym[];
- extern char *tokstring[];
- extern char *flags[];
-
- extern int gen_debug; /* TRUE to generate debugging tables */
-
- /* following are used by lex.c */
-
- extern int errors;
- extern void report_err(/* char *msg */ );
- extern void abort_trap(/* char *msg */ );
- extern void error(/* char *msg */ );
- extern void warn(/* char *msg */ );
- extern void symerror(/* char *sym, *msg */ );
-
- /* returns 1 if OK, 0 if can't open file */
- extern int open_lex( /* char *filename */ );
-
- extern void readline( /* char *line, int maxlen */ );
- extern int yesresp( /* char *msg */ );
- extern char resp( /* char *msg */ );
- extern int prompt_len; /* 0 or 2, depending on sfile */
- extern void next_token(); /* return the 'next' token */
- extern void tokenread(); /* advance the read head */
- extern int tokenx, tokary[], skip_source;
- extern void show_lex(); /* display state of lexical analysis */
-
- extern void close_lex();
-
- /* This is the main parser function */
-
- extern void parser(); /* Carries out a complete parse */
-
- #if DEBUG == 1
- /* These are the debugging functions */
-
- extern char resp();
- extern char *prodtrap; /* NULL or set of productions to trap on */
- extern int debug_level,
- trace_mode;
-
- extern char *symtypenames[];
- extern void print_tree(semrectype *root);
- extern void idebug();
- extern void inspect_sem( /* int indent; semrectype *root */ );
- extern void inspect_stack( /* int *stack, int stackx, char kind */ );
- extern void dump_sym( /* symtabtype *root */ );
- extern void dump_sem( /* int indent; semrectype *root */ );
- extern void stk_dump(/* int kind, int *stack, int stackx, int debug_level */) ;
- #endif
-
- #endif
-