1 /* $OpenBSD: defs.h,v 1.11 2005/06/08 03:18:59 pvalchev Exp $ */ 2 /* $NetBSD: defs.h,v 1.6 1996/03/19 03:21:30 jtc Exp $ */ 3 4 /* 5 * Copyright (c) 1989 The Regents of the University of California. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Robert Paul Corbett. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)defs.h 5.6 (Berkeley) 5/24/93 36 */ 37 38 #include <assert.h> 39 #include <ctype.h> 40 #include <stdio.h> 41 #include <string.h> 42 #include <stdlib.h> 43 44 /* machine-dependent definitions */ 45 /* the following definitions are for the Tahoe */ 46 /* they might have to be changed for other machines */ 47 48 /* MAXCHAR is the largest unsigned character value */ 49 /* MAXSHORT is the largest value of a C short */ 50 /* MINSHORT is the most negative value of a C short */ 51 /* MAXTABLE is the maximum table size */ 52 /* BITS_PER_WORD is the number of bits in a C unsigned */ 53 /* WORDSIZE computes the number of words needed to */ 54 /* store n bits */ 55 /* BIT returns the value of the n-th bit starting */ 56 /* from r (0-indexed) */ 57 /* SETBIT sets the n-th bit starting from r */ 58 59 #define MAXCHAR 255 60 #define MAXSHORT 32767 61 #define MINSHORT -32768 62 #define MAXTABLE 32500 63 #define BITS_PER_WORD 32 64 #define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) 65 #define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1) 66 #define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31))) 67 68 69 /* character names */ 70 71 #define NUL '\0' /* the null character */ 72 #define NEWLINE '\n' /* line feed */ 73 #define SP ' ' /* space */ 74 #define BS '\b' /* backspace */ 75 #define HT '\t' /* horizontal tab */ 76 #define VT '\013' /* vertical tab */ 77 #define CR '\r' /* carriage return */ 78 #define FF '\f' /* form feed */ 79 #define QUOTE '\'' /* single quote */ 80 #define DOUBLE_QUOTE '\"' /* double quote */ 81 #define BACKSLASH '\\' /* backslash */ 82 83 84 /* defines for constructing filenames */ 85 86 #define CODE_SUFFIX ".code.c" 87 #define DEFINES_SUFFIX ".tab.h" 88 #define OUTPUT_SUFFIX ".tab.c" 89 #define VERBOSE_SUFFIX ".output" 90 91 92 /* keyword codes */ 93 94 #define TOKEN 0 95 #define LEFT 1 96 #define RIGHT 2 97 #define NONASSOC 3 98 #define MARK 4 99 #define TEXT 5 100 #define TYPE 6 101 #define START 7 102 #define UNION 8 103 #define IDENT 9 104 #define EXPECT 10 105 106 107 /* symbol classes */ 108 109 #define UNKNOWN 0 110 #define TERM 1 111 #define NONTERM 2 112 113 114 /* the undefined value */ 115 116 #define UNDEFINED (-1) 117 118 119 /* action codes */ 120 121 #define SHIFT 1 122 #define REDUCE 2 123 124 125 /* character macros */ 126 127 #define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') 128 #define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') 129 #define NUMERIC_VALUE(c) ((c) - '0') 130 131 132 /* symbol macros */ 133 134 #define ISTOKEN(s) ((s) < start_symbol) 135 #define ISVAR(s) ((s) >= start_symbol) 136 137 138 /* storage allocation macros */ 139 140 #define CALLOC(k,n) (calloc((unsigned)(k),(unsigned)(n))) 141 #define FREE(x) (free((char*)(x))) 142 #define MALLOC(n) (malloc((unsigned)(n))) 143 #define NEW(t) ((t*)allocate(sizeof(t))) 144 #define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t)))) 145 #define REALLOC(p,n) (realloc((char*)(p),(unsigned)(n))) 146 147 148 /* the structure of a symbol table entry */ 149 150 typedef struct bucket bucket; 151 struct bucket 152 { 153 struct bucket *link; 154 struct bucket *next; 155 char *name; 156 char *tag; 157 short value; 158 short index; 159 short prec; 160 char class; 161 char assoc; 162 }; 163 164 165 /* the structure of the LR(0) state machine */ 166 167 typedef struct core core; 168 struct core 169 { 170 struct core *next; 171 struct core *link; 172 short number; 173 short accessing_symbol; 174 short nitems; 175 short items[1]; 176 }; 177 178 179 /* the structure used to record shifts */ 180 181 typedef struct shifts shifts; 182 struct shifts 183 { 184 struct shifts *next; 185 short number; 186 short nshifts; 187 short shift[1]; 188 }; 189 190 191 /* the structure used to store reductions */ 192 193 typedef struct reductions reductions; 194 struct reductions 195 { 196 struct reductions *next; 197 short number; 198 short nreds; 199 short rules[1]; 200 }; 201 202 203 /* the structure used to represent parser actions */ 204 205 typedef struct action action; 206 struct action 207 { 208 struct action *next; 209 short symbol; 210 short number; 211 short prec; 212 char action_code; 213 char assoc; 214 char suppressed; 215 }; 216 217 218 /* global variables */ 219 220 extern char dflag; 221 extern char lflag; 222 extern char rflag; 223 extern char tflag; 224 extern char vflag; 225 extern char *symbol_prefix; 226 227 extern char *cptr; 228 extern char *line; 229 extern int lineno; 230 extern int outline; 231 232 extern char *banner[]; 233 extern char *tables[]; 234 extern char *header[]; 235 extern char *body[]; 236 extern char *trailer[]; 237 238 extern char *action_file_name; 239 extern char *code_file_name; 240 extern char *defines_file_name; 241 extern char *input_file_name; 242 extern char *output_file_name; 243 extern char *text_file_name; 244 extern char *union_file_name; 245 extern char *verbose_file_name; 246 247 extern FILE *action_file; 248 extern FILE *code_file; 249 extern FILE *defines_file; 250 extern FILE *input_file; 251 extern FILE *output_file; 252 extern FILE *text_file; 253 extern FILE *union_file; 254 extern FILE *verbose_file; 255 256 extern int nitems; 257 extern int nrules; 258 extern int nsyms; 259 extern int ntokens; 260 extern int nvars; 261 extern int ntags; 262 263 extern char unionized; 264 extern char line_format[]; 265 266 extern int start_symbol; 267 extern char **symbol_name; 268 extern short *symbol_value; 269 extern short *symbol_prec; 270 extern char *symbol_assoc; 271 272 extern short *ritem; 273 extern short *rlhs; 274 extern short *rrhs; 275 extern short *rprec; 276 extern char *rassoc; 277 278 extern short **derives; 279 extern char *nullable; 280 281 extern bucket *first_symbol; 282 extern bucket *last_symbol; 283 284 extern int nstates; 285 extern core *first_state; 286 extern shifts *first_shift; 287 extern reductions *first_reduction; 288 extern short *accessing_symbol; 289 extern core **state_table; 290 extern shifts **shift_table; 291 extern reductions **reduction_table; 292 extern unsigned *LA; 293 extern short *LAruleno; 294 extern short *lookaheads; 295 extern short *goto_map; 296 extern short *from_state; 297 extern short *to_state; 298 299 extern action **parser; 300 extern int SRtotal; 301 extern int SRexpect; 302 extern int RRtotal; 303 extern short *SRconflicts; 304 extern short *RRconflicts; 305 extern short *defred; 306 extern short *rules_used; 307 extern short nunused; 308 extern short final_state; 309 310 /* global functions */ 311 312 extern char *allocate(); 313 extern bucket *lookup(); 314 extern bucket *make_bucket(); 315 extern void set_first_derives(void); 316 extern void closure(short *, int); 317 extern void finalize_closure(void); 318 319 extern void fatal(char *); 320 321 extern void reflexive_transitive_closure(unsigned *, int); 322 extern void done(int); 323 324 extern void no_space(void); 325 extern void open_error(char *); 326 extern void open_write_error(char *); 327 extern void unexpected_EOF(void); 328 extern void print_pos(char *, char *); 329 extern void syntax_error(int, char *, char *); 330 extern void unterminated_comment(int, char *, char *); 331 extern void unterminated_string(int, char *, char *); 332 extern void unterminated_text(int, char *, char *); 333 extern void unterminated_union(int, char *, char *); 334 extern void over_unionized(char *); 335 extern void illegal_tag(int, char *, char *); 336 extern void illegal_character(char *); 337 extern void used_reserved(char *); 338 extern void tokenized_start(char *); 339 extern void retyped_warning(char *); 340 extern void reprec_warning(char *); 341 extern void revalued_warning(char *); 342 extern void terminal_start(char *); 343 extern void restarted_warning(void); 344 extern void no_grammar(void); 345 extern void terminal_lhs(int); 346 extern void prec_redeclared(void); 347 extern void unterminated_action(int, char *, char *); 348 extern void dollar_warning(int, int); 349 extern void dollar_error(int, char *, char *); 350 extern void untyped_lhs(void); 351 extern void untyped_rhs(int, char *); 352 extern void unknown_rhs(int); 353 extern void default_action_warning(void); 354 extern void undefined_goal(char *); 355 extern void undefined_symbol_warning(char *); 356 357 extern void lalr(void); 358 359 extern void reader(void); 360 extern void lr0(void); 361 extern void make_parser(void); 362 extern void verbose(void); 363 extern void output(void); 364 extern void free_parser(void); 365 extern void write_section(char *[]); 366 367 extern void create_symbol_table(void); 368 extern void free_symbol_table(void); 369 extern void free_symbols(void); 370 371 372 /* system variables */ 373 374 extern char *__progname; 375