1 /* $Id: defs.h,v 1.38 2014/01/01 14:23:27 Christos.Zoulas Exp $ */ 2 3 #ifdef HAVE_CONFIG_H 4 #include <config.h> 5 #endif 6 7 #include <stdlib.h> 8 #include <string.h> 9 #include <errno.h> 10 #include <assert.h> 11 #include <ctype.h> 12 #include <stdio.h> 13 14 #if defined(__cplusplus) /* __cplusplus, etc. */ 15 #define class myClass 16 #endif 17 18 #define YYMAJOR 1 19 #define YYMINOR 9 20 21 #define CONCAT(first,second) first #second 22 #define CONCAT1(string,number) CONCAT(string, number) 23 #define CONCAT2(first,second) #first "." #second 24 25 #ifdef YYPATCH 26 #define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH) 27 #else 28 #define VSTRING(a,b) CONCAT2(a,b) 29 #endif 30 31 #define VERSION VSTRING(YYMAJOR, YYMINOR) 32 33 /* machine-dependent definitions */ 34 /* the following definitions are for the Tahoe */ 35 /* they might have to be changed for other machines */ 36 37 /* MAXCHAR is the largest unsigned character value */ 38 /* MAXSHORT is the largest value of a C short */ 39 /* MINSHORT is the most negative value of a C short */ 40 /* MAXTABLE is the maximum table size */ 41 /* BITS_PER_WORD is the number of bits in a C unsigned */ 42 /* WORDSIZE computes the number of words needed to */ 43 /* store n bits */ 44 /* BIT returns the value of the n-th bit starting */ 45 /* from r (0-indexed) */ 46 /* SETBIT sets the n-th bit starting from r */ 47 48 #define MAXCHAR 255 49 #define MAXSHORT 32767 50 #define MINSHORT -32768 51 #define MAXTABLE 32500 52 #define BITS_PER_WORD 32 53 #define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) 54 #define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1) 55 #define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31))) 56 57 /* character names */ 58 59 #define NUL '\0' /* the null character */ 60 #define NEWLINE '\n' /* line feed */ 61 #define SP ' ' /* space */ 62 #define BS '\b' /* backspace */ 63 #define HT '\t' /* horizontal tab */ 64 #define VT '\013' /* vertical tab */ 65 #define CR '\r' /* carriage return */ 66 #define FF '\f' /* form feed */ 67 #define QUOTE '\'' /* single quote */ 68 #define DOUBLE_QUOTE '\"' /* double quote */ 69 #define BACKSLASH '\\' /* backslash */ 70 71 #define UCH(c) (unsigned char)(c) 72 73 /* defines for constructing filenames */ 74 75 #if defined(VMS) 76 #define CODE_SUFFIX "_code.c" 77 #define DEFINES_SUFFIX "_tab.h" 78 #define EXTERNS_SUFFIX "_tab.i" 79 #define OUTPUT_SUFFIX "_tab.c" 80 #else 81 #define CODE_SUFFIX ".code.c" 82 #define DEFINES_SUFFIX ".tab.h" 83 #define EXTERNS_SUFFIX ".tab.i" 84 #define OUTPUT_SUFFIX ".tab.c" 85 #endif 86 #define VERBOSE_SUFFIX ".output" 87 #define GRAPH_SUFFIX ".dot" 88 89 /* keyword codes */ 90 91 #define TOKEN 0 92 #define LEFT 1 93 #define RIGHT 2 94 #define NONASSOC 3 95 #define MARK 4 96 #define TEXT 5 97 #define TYPE 6 98 #define START 7 99 #define UNION 8 100 #define IDENT 9 101 #define EXPECT 10 102 #define EXPECT_RR 11 103 #define PURE_PARSER 12 104 #define PARSE_PARAM 13 105 #define LEX_PARAM 14 106 #define POSIX_YACC 15 107 #define TOKEN_TABLE 16 108 109 /* symbol classes */ 110 111 #define UNKNOWN 0 112 #define TERM 1 113 #define NONTERM 2 114 115 /* the undefined value */ 116 117 #define UNDEFINED (-1) 118 119 /* action codes */ 120 121 #define SHIFT 1 122 #define REDUCE 2 123 124 /* character macros */ 125 126 #define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') 127 #define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') 128 #define NUMERIC_VALUE(c) ((c) - '0') 129 130 /* symbol macros */ 131 132 #define ISTOKEN(s) ((s) < start_symbol) 133 #define ISVAR(s) ((s) >= start_symbol) 134 135 /* storage allocation macros */ 136 137 #define CALLOC(k,n) (calloc((size_t)(k),(size_t)(n))) 138 #define FREE(x) (free((char*)(x))) 139 #define MALLOC(n) (malloc((size_t)(n))) 140 #define TMALLOC(t,n) ((t*) malloc((size_t)(n) * sizeof(t))) 141 #define NEW(t) ((t*)allocate(sizeof(t))) 142 #define NEW2(n,t) ((t*)allocate(((size_t)(n)*sizeof(t)))) 143 #define REALLOC(p,n) (realloc((char*)(p),(size_t)(n))) 144 #define TREALLOC(t,p,n) ((t*)realloc((char*)(p), (size_t)(n) * sizeof(t))) 145 146 #define DO_FREE(x) if (x) { FREE(x); x = 0; } 147 148 #define NO_SPACE(p) if (p == 0) no_space(); assert(p != 0) 149 150 /* messages */ 151 #define PLURAL(n) ((n) > 1 ? "s" : "") 152 153 typedef char Assoc_t; 154 typedef char Class_t; 155 typedef short Index_t; 156 typedef short Value_t; 157 158 /* the structure of a symbol table entry */ 159 160 typedef struct bucket bucket; 161 struct bucket 162 { 163 struct bucket *link; 164 struct bucket *next; 165 char *name; 166 char *tag; 167 Value_t value; 168 Index_t index; 169 Value_t prec; 170 Class_t class; 171 Assoc_t assoc; 172 }; 173 174 /* the structure of the LR(0) state machine */ 175 176 typedef struct core core; 177 struct core 178 { 179 struct core *next; 180 struct core *link; 181 Value_t number; 182 Value_t accessing_symbol; 183 Value_t nitems; 184 Value_t items[1]; 185 }; 186 187 /* the structure used to record shifts */ 188 189 typedef struct shifts shifts; 190 struct shifts 191 { 192 struct shifts *next; 193 Value_t number; 194 Value_t nshifts; 195 Value_t shift[1]; 196 }; 197 198 /* the structure used to store reductions */ 199 200 typedef struct reductions reductions; 201 struct reductions 202 { 203 struct reductions *next; 204 Value_t number; 205 Value_t nreds; 206 Value_t rules[1]; 207 }; 208 209 /* the structure used to represent parser actions */ 210 211 typedef struct action action; 212 struct action 213 { 214 struct action *next; 215 Value_t symbol; 216 Value_t number; 217 Value_t prec; 218 char action_code; 219 Assoc_t assoc; 220 char suppressed; 221 }; 222 223 /* the structure used to store parse/lex parameters */ 224 typedef struct param param; 225 struct param 226 { 227 struct param *next; 228 char *name; /* parameter name */ 229 char *type; /* everything before parameter name */ 230 char *type2; /* everything after parameter name */ 231 }; 232 233 /* global variables */ 234 235 extern char dflag; 236 extern char gflag; 237 extern char iflag; 238 extern char lflag; 239 extern char rflag; 240 extern char sflag; 241 extern char tflag; 242 extern char vflag; 243 extern const char *symbol_prefix; 244 245 extern const char *myname; 246 extern char *cptr; 247 extern char *line; 248 extern int lineno; 249 extern int outline; 250 extern int exit_code; 251 extern int pure_parser; 252 extern int token_table; 253 254 extern const char *const banner[]; 255 extern const char *const xdecls[]; 256 extern const char *const tables[]; 257 extern const char *const global_vars[]; 258 extern const char *const impure_vars[]; 259 extern const char *const hdr_defs[]; 260 extern const char *const hdr_vars[]; 261 extern const char *const body_1[]; 262 extern const char *const body_vars[]; 263 extern const char *const body_2[]; 264 extern const char *const body_3[]; 265 extern const char *const trailer[]; 266 extern const char *const trailer_2[]; 267 268 extern char *code_file_name; 269 extern char *input_file_name; 270 extern char *defines_file_name; 271 extern char *externs_file_name; 272 273 extern FILE *action_file; 274 extern FILE *code_file; 275 extern FILE *defines_file; 276 extern FILE *externs_file; 277 extern FILE *input_file; 278 extern FILE *output_file; 279 extern FILE *text_file; 280 extern FILE *union_file; 281 extern FILE *verbose_file; 282 extern FILE *graph_file; 283 284 extern int nitems; 285 extern int nrules; 286 extern int nsyms; 287 extern int ntokens; 288 extern int nvars; 289 extern int ntags; 290 291 extern char unionized; 292 extern char line_format[]; 293 294 extern Value_t start_symbol; 295 extern char **symbol_name; 296 extern char **symbol_pname; 297 extern Value_t *symbol_value; 298 extern Value_t *symbol_prec; 299 extern char *symbol_assoc; 300 301 extern Value_t *ritem; 302 extern Value_t *rlhs; 303 extern Value_t *rrhs; 304 extern Value_t *rprec; 305 extern Assoc_t *rassoc; 306 307 extern Value_t **derives; 308 extern char *nullable; 309 310 extern bucket *first_symbol; 311 extern bucket *last_symbol; 312 313 extern int nstates; 314 extern core *first_state; 315 extern shifts *first_shift; 316 extern reductions *first_reduction; 317 extern Value_t *accessing_symbol; 318 extern core **state_table; 319 extern shifts **shift_table; 320 extern reductions **reduction_table; 321 extern unsigned *LA; 322 extern Value_t *LAruleno; 323 extern Value_t *lookaheads; 324 extern Value_t *goto_map; 325 extern Value_t *from_state; 326 extern Value_t *to_state; 327 328 extern action **parser; 329 extern int SRexpect; 330 extern int RRexpect; 331 extern int SRtotal; 332 extern int RRtotal; 333 extern Value_t *SRconflicts; 334 extern Value_t *RRconflicts; 335 extern Value_t *defred; 336 extern Value_t *rules_used; 337 extern Value_t nunused; 338 extern Value_t final_state; 339 340 extern Value_t *itemset; 341 extern Value_t *itemsetend; 342 extern unsigned *ruleset; 343 344 extern param *lex_param; 345 extern param *parse_param; 346 347 /* global functions */ 348 349 extern bucket *lookup(const char *); 350 extern bucket *make_bucket(const char *); 351 352 #ifndef GCC_NORETURN 353 #if defined(__dead2) 354 #define GCC_NORETURN __dead2 355 #elif defined(__dead) 356 #define GCC_NORETURN __dead 357 #else 358 #define GCC_NORETURN /* nothing */ 359 #endif 360 #endif 361 362 #ifndef GCC_UNUSED 363 #if defined(__unused) 364 #define GCC_UNUSED __unused 365 #else 366 #define GCC_UNUSED /* nothing */ 367 #endif 368 #endif 369 370 /* closure.c */ 371 extern void closure(Value_t * nucleus, int n); 372 extern void finalize_closure(void); 373 extern void set_first_derives(void); 374 375 /* error.c */ 376 extern void default_action_warning(void); 377 extern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 378 extern void dollar_warning(int a_lineno, int i); 379 extern void fatal(const char *msg) GCC_NORETURN; 380 extern void illegal_character(char *c_cptr) GCC_NORETURN; 381 extern void illegal_tag(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 382 extern void missing_brace(void) GCC_NORETURN; 383 extern void no_grammar(void) GCC_NORETURN; 384 extern void no_space(void) GCC_NORETURN; 385 extern void open_error(const char *filename) GCC_NORETURN; 386 extern void over_unionized(char *u_cptr) GCC_NORETURN; 387 extern void prec_redeclared(void); 388 extern void reprec_warning(char *s); 389 extern void restarted_warning(void); 390 extern void retyped_warning(char *s); 391 extern void revalued_warning(char *s); 392 extern void syntax_error(int st_lineno, char *st_line, char *st_cptr) GCC_NORETURN; 393 extern void terminal_lhs(int s_lineno) GCC_NORETURN; 394 extern void terminal_start(char *s) GCC_NORETURN; 395 extern void tokenized_start(char *s) GCC_NORETURN; 396 extern void undefined_goal(char *s) GCC_NORETURN; 397 extern void undefined_symbol_warning(char *s); 398 extern void unexpected_EOF(void) GCC_NORETURN; 399 extern void unknown_rhs(int i) GCC_NORETURN; 400 extern void unterminated_action(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 401 extern void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) GCC_NORETURN; 402 extern void unterminated_string(int s_lineno, char *s_line, char *s_cptr) GCC_NORETURN; 403 extern void unterminated_text(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 404 extern void unterminated_union(int u_lineno, char *u_line, char *u_cptr) GCC_NORETURN; 405 extern void untyped_lhs(void) GCC_NORETURN; 406 extern void untyped_rhs(int i, char *s) GCC_NORETURN; 407 extern void used_reserved(char *s) GCC_NORETURN; 408 409 /* graph.c */ 410 extern void graph(void); 411 412 /* lalr.c */ 413 extern void create_symbol_table(void); 414 extern void free_symbol_table(void); 415 extern void free_symbols(void); 416 417 /* lalr.c */ 418 extern void lalr(void); 419 420 /* lr0.c */ 421 extern void lr0(void); 422 extern void show_cores(void); 423 extern void show_ritems(void); 424 extern void show_rrhs(void); 425 extern void show_shifts(void); 426 427 /* main.c */ 428 extern void *allocate(size_t n); 429 extern void done(int k) GCC_NORETURN; 430 431 /* mkpar.c */ 432 extern void free_parser(void); 433 extern void make_parser(void); 434 435 /* output.c */ 436 extern void output(void); 437 438 /* reader.c */ 439 extern void reader(void); 440 441 /* skeleton.c */ 442 extern void write_section(FILE * fp, const char *const section[]); 443 444 /* verbose.c */ 445 extern void verbose(void); 446 447 /* warshall.c */ 448 extern void reflexive_transitive_closure(unsigned *R, int n); 449 450 #ifdef NO_LEAKS 451 extern void lr0_leaks(void); 452 extern void lalr_leaks(void); 453 extern void mkpar_leaks(void); 454 extern void output_leaks(void); 455 extern void reader_leaks(void); 456 #endif 457