home *** CD-ROM | disk | FTP | other *** search
/ The Education Master 1994 (4th Edition) / EDUCATIONS_MASTER_4TH_EDITION.bin / files / progmisc / qparser2 / cskels / decl.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-07  |  9.3 KB  |  304 lines

  1. /*  (skel)decl.h
  2.  
  3.   QPARSER 4.0, QCAD Systems, Inc., San Jose, CA.
  4.   This code may be reproduced, modified, or built into third party software
  5. in any way deemed suitable by the purchaser of the QPARSER product.
  6.  
  7. General description:
  8.  
  9.   This skeleton file must be passed through lr1p with a suitable grammar
  10. file to generate a compilable C file, e.g. decls.h.
  11.   It and its companion C and skeleton-C files are guaranteed to compile,
  12. link and execute correctly under the Microsoft C or Unix compilation
  13. environment.  See the make file for your environment for more details:
  14.  
  15.   Microsoft:  m
  16.   Turbo:      makefile.mak
  17.   Unix:       makefile
  18.   Macintosh:  ???
  19.  
  20.   The compiler directive MSDOS, TCC, or UNIX is 
  21. required for the specific environment chosen.  Don't specify more than 
  22. one of these.
  23.   Other environments or compilers may require modifications to this
  24. source code.  Note that a modification to the skeleton and base C files
  25. will result in correct generated code for the new environment.
  26.  
  27.   */
  28.  
  29. #ifndef DECL_H
  30. #define DECL_H
  31.  
  32. #ifdef MSDOS
  33. #include <malloc.h>
  34. #endif
  35. #ifdef TCC
  36. #include <alloc.h>
  37. #endif
  38.  
  39. #ifndef SETSIZE
  40. #  include "sets.h"
  41. #endif
  42.  
  43. #define SHOWLINES 18   /* how many lines to put on a screen before 'more' */
  44.  
  45. #define HASHSIZE 167   /* number of symbol table hash buckets */
  46.  
  47. /*  definitions of base symbol table attributes.
  48.     Additional attributes may be added as desired -- but also extend
  49.     the corresponding array 'symtypenames' in skeltab.c, and
  50.     the 'dump_sym' function in skeldbug.c !!! */
  51. #define RESERVED 0     /*reserved token*/
  52. #define SYMERR 1       /*error recovery symbol*/
  53. #define USER 2         /*unknown default*/
  54. #define INTVAR 3       /*integer type*/
  55. #define REALVAR 4       /*real type*/
  56. #define STRVAR 5       /*string type*/
  57. #define CHART  6       /*character type*/
  58.  
  59. /*  The DEBUG_CHAR is a character which, when inserted in the
  60.     parser's source code, invokes Qparser debugging.
  61.     Debugging is enabled by compiling with -DDEBUG */
  62.  
  63. #define DEBUG_CHAR   '!'
  64.  
  65. typedef struct semrec_struct semrectype;
  66. typedef struct symtab_struct symtabtype;
  67.  
  68. extern symtabtype *symtab[HASHSIZE];
  69.  
  70. extern void inittables();  /* in qlex.c */
  71. extern int clevel;  /* symbol entry level number: -1 == reserved tokens */
  72.  
  73.   /* call this once before commencing with symbol table building */
  74. extern void init_sym();
  75.  
  76.   /* findsym: find a symbol.  Returns NULL if not in table */
  77. extern symtabtype *findsym( /* char *fsym */ );
  78.  
  79.  /* makesym returns a symbol entry if there; makes a new one if not.
  80.     Useful for FORTRAN-style variable declaration -- declare name
  81.     on first appearance, whether in a declaration or not.
  82.     syt: symbol type
  83.      */
  84. extern symtabtype *makesym( /* char *fsym; int syt */ );
  85.  
  86.   /* forcesym: forces a new symbol entry.  Use this for declarations
  87.     to cover a previous declaration with the same name. */
  88. extern symtabtype *forcesym( /* char *fsym; int syt */ );
  89.  
  90.   /* clearsym: sets the symbol table pointers to remove references to
  91.     everything at level >= clevel, assuming that level numbers
  92.     are monotonic.  Frees memory space. */
  93. extern void clearsym( /* int clevel */ );
  94.  
  95.   /* shows all the symbols in the symbol table*/
  96. extern void dump_all();
  97.  
  98. /* Semantics stuff */
  99.  
  100. #define STACKSIZE 100   /*maximum size of stack*/
  101.  
  102. extern int cstate;   /* TOS state -- not in stack! */
  103. extern int stack[];  /* array of other states */
  104. extern int stackx;   /* stack[stackx] is at the top of the stack */
  105. extern semrectype *semstack[];  /* semantics stack */
  106. extern int token,   /* current token number */
  107.            errpos,     /* position of current token in input line */
  108.            errors,
  109.            err_count;  /* if > 0, don't report syntax errors */
  110. extern semrectype *lsemp;   /* holds current semantics element */
  111. extern semrectype *lsempary[2];  /* holds current and 'next ' element */
  112.  
  113. /*Parser gen constants*/
  114. #define IDENT_TOKLEN 15
  115. #define MAXTOKLEN 15
  116. #define MAXFLAGLEN 9
  117. #define MAXRPLEN 4
  118. #define MAXNRPLEN 2
  119. #define TERM_TOKS 15
  120. #define NTERM_TOKS 7
  121. #define ALL_TOKS  22
  122. #define IDENT_TOKX  10
  123. #define INT_TOKX  11
  124. #define REAL_TOKX  12
  125. #define STR_TOKX  14
  126. #define CHAR_TOKX  8
  127. #define STOP_TOKX  13
  128. #define GOAL_TOKX  18
  129. #define EOL_TOKX  9
  130. #define REDUCELEN  17
  131. #define READSTATE  18
  132. #define LREADSTATE  33
  133. #define LOOKSTATE  34
  134. #define MAXSTATE  37
  135. #define RLTOKENS  48
  136. #define SSTOKENS  22
  137. #define PRODTOKS  68
  138. #define TOKCHARS  123
  139. #define START_STATE  1
  140. #define ISTK_STATE  1
  141.  
  142.  
  143. /* reserved flags used in SEMREC stuff */
  144. #define OTHER  0
  145. #define FIRST_SEMTYPE  OTHER
  146.  
  147. #define SEMERR 1
  148. #define IDENT  2
  149. #define FIXED  3
  150. #define FLOAT  4
  151. #define STRNG  5
  152. #define CHAR   6
  153. #define GENL_KIND 7
  154. /* add more special semantic flags as needed here */
  155. #define OFFSET  8     /* one plus the previous flag */
  156.  
  157. #define FLAG_ARRAY_DIM (OFFSET+12)
  158. /* Production flags */
  159. #define ASSIGN1 (OFFSET+0)
  160. #define DIVIDE (OFFSET+1)
  161. #define INTVAL (OFFSET+2)
  162. #define MINUS (OFFSET+3)
  163. #define MPY (OFFSET+4)
  164. #define PARENS (OFFSET+5)
  165. #define PLUS (OFFSET+6)
  166. #define PRTVAL (OFFSET+7)
  167. #define QUIT (OFFSET+8)
  168. #define REALVAL (OFFSET+9)
  169. #define UMINUS (OFFSET+10)
  170. #define VARIABLE (OFFSET+11)
  171. #define LAST_SEMTYPE (OFFSET+11)
  172.  
  173.  
  174. /* node tracing set used by QTREES */
  175. #define TSETSIZE  (SETSIZE(LAST_SEMTYPE+1))
  176. extern char trace_nodes[TSETSIZE];
  177.  
  178. /* new_sem: allocates and partially initializes a semrectype */
  179. extern semrectype *new_sem( /* int semt, symt */ );
  180.  
  181. /* these are standard definitions for Qtrees */
  182. #define POSITION(N) usem.position0[(N)-1]
  183. #define CHILD usem.position0[0]
  184. #define LEFT  usem.position0[0]
  185. #define RIGHT usem.position0[1]
  186. #define ONE   usem.position0[0]
  187. #define TWO   usem.position0[1]
  188. #define THREE usem.position0[2]
  189. #define FOUR  usem.position0[3]
  190. #define FIVE  usem.position0[4]
  191.  
  192.  
  193.  
  194. struct symtab_struct {
  195.    symtabtype *next;  /* linked list of symbols hashing to same bucket */
  196.    int level;    /* scope level: -1 is for reserved tokens, 0 global, etc.*/
  197.    char *sym;    /* the symbol referring to one of the following values */
  198.    int symt;  /* USER, INTVAR, REALVAR, etc. */
  199.    union {
  200.      int tokval;         /* RESERVED */
  201.      long int numval;    /* INTVAR, CHART */
  202.      double rval;        /* REALVAR */
  203.      char   *strx;       /* STRVAR */
  204.      /* +++ add customization here; also extend these:
  205.  
  206.             FILE              FUNCTION/VARIABLE
  207.             -----------------------------------
  208.             skeltab.c         symtypenames
  209.             skelsyms.c        new_sym, printf_sym, free_symtab_item
  210.             skeldbug.c        dump_sym
  211.  
  212.         --- */
  213.     double value;  /* we need a slot to carry a double value associated
  214.                       with an <identifer> */
  215.  
  216.  
  217.      } usym;
  218.    };
  219.  
  220. struct semrec_struct {
  221.   int symt;  /* type definition of this node: USER, INTVAR, REALVAR,
  222.                     STRVAR, etc. */
  223.   int semt;  /* semantics type: IDENT, FIXED, etc. */
  224.   union {
  225.     symtabtype *symp;  /* IDENT */
  226.     long int numval;    /* FIXED, CHAR */
  227.     double rval;  /* FLOAT */
  228.     char *strx;   /* STRNG */
  229.     /* +++ add customization here --- */
  230.  
  231.     semrectype  *position0[MAXNRPLEN];  /* 0-based */
  232.     } usem;
  233.   };
  234.  
  235. /* the all-important apply function */
  236.  
  237. extern semrectype *apply( /* int cstate */ );
  238.  
  239. /* the parser tables; these are in skeltab.c  */
  240. extern short statex[];
  241. extern short map[];
  242. extern char  popno[];
  243. extern short toknum[];
  244. extern short tostate[];
  245. extern short stk_state[];
  246. extern short stk_tostate[];
  247. extern short psmx[];
  248. extern char  psmpos[];
  249. extern short prodx[];
  250. extern short prods[];
  251. extern short insym[];
  252. extern char  *tokstring[];
  253. extern char  *flags[];
  254.  
  255. extern int gen_debug;  /* TRUE to generate debugging tables */
  256.  
  257. /* following are used by lex.c */
  258.  
  259. extern int errors;
  260. extern void report_err(/* char *msg */ );
  261. extern void abort_trap(/* char *msg */ );
  262. extern void error(/* char *msg */ );
  263. extern void warn(/* char *msg */ );
  264. extern void symerror(/* char *sym, *msg */ );
  265.  
  266. /* returns 1 if OK, 0 if can't open file */
  267. extern int open_lex( /* char *filename */ );
  268.  
  269. extern void readline( /* char *line, int maxlen */ );
  270. extern int yesresp( /* char *msg */ );
  271. extern char resp( /* char *msg */ );
  272. extern int prompt_len;   /* 0 or 2, depending on sfile */
  273. extern void next_token();  /* return the 'next' token */
  274. extern void tokenread();   /* advance the read head */
  275. extern int tokenx, tokary[], skip_source;
  276. extern void show_lex();    /* display state of lexical analysis */
  277.  
  278. extern void close_lex();
  279.  
  280. /* This is the main parser function */
  281.  
  282. extern void parser();      /* Carries out a complete parse */
  283.  
  284. #if DEBUG == 1
  285. /* These are the debugging functions */
  286.  
  287. extern char resp();
  288. extern char *prodtrap;  /* NULL or set of productions to trap on */
  289. extern int debug_level,
  290.            trace_mode;
  291.  
  292. extern char *symtypenames[];
  293. extern void print_tree(semrectype *root);
  294. extern void idebug();
  295. extern void inspect_sem( /* int indent; semrectype *root */ );
  296. extern void inspect_stack( /* int *stack, int stackx, char kind */ );
  297. extern void dump_sym( /* symtabtype *root */ );
  298. extern void dump_sem( /* int indent; semrectype *root */ );
  299. extern void stk_dump(/* int kind, int *stack, int stackx, int debug_level */) ;
  300. #endif
  301.  
  302. #endif
  303.  
  304.