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*/
- #define IDENT_TOKLEN 15
- #define MAXTOKLEN 15
- #define MAXFLAGLEN 9
- #define MAXRPLEN 4
- #define MAXNRPLEN 2
- #define TERM_TOKS 15
- #define NTERM_TOKS 7
- #define ALL_TOKS 22
- #define IDENT_TOKX 10
- #define INT_TOKX 11
- #define REAL_TOKX 12
- #define STR_TOKX 14
- #define CHAR_TOKX 8
- #define STOP_TOKX 13
- #define GOAL_TOKX 18
- #define EOL_TOKX 9
- #define REDUCELEN 17
- #define READSTATE 18
- #define LREADSTATE 33
- #define LOOKSTATE 34
- #define MAXSTATE 37
- #define RLTOKENS 48
- #define SSTOKENS 22
- #define PRODTOKS 68
- #define TOKCHARS 123
- #define START_STATE 1
- #define ISTK_STATE 1
-
-
- /* 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 */
-
- #define FLAG_ARRAY_DIM (OFFSET+12)
- /* Production flags */
- #define ASSIGN1 (OFFSET+0)
- #define DIVIDE (OFFSET+1)
- #define INTVAL (OFFSET+2)
- #define MINUS (OFFSET+3)
- #define MPY (OFFSET+4)
- #define PARENS (OFFSET+5)
- #define PLUS (OFFSET+6)
- #define PRTVAL (OFFSET+7)
- #define QUIT (OFFSET+8)
- #define REALVAL (OFFSET+9)
- #define UMINUS (OFFSET+10)
- #define VARIABLE (OFFSET+11)
- #define LAST_SEMTYPE (OFFSET+11)
-
-
- /* 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]
-
-
-
- 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
-
- --- */
- double value; /* we need a slot to carry a double value associated
- with an <identifer> */
-
-
- } 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 --- */
-
- 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
-
-