1 /* $NetBSD: defs.h,v 1.20 2024/09/14 21:29:02 christos Exp $ */ 2 3 /* Id: defs.h,v 1.74 2023/05/18 21:28:05 tom Exp */ 4 5 #if HAVE_NBTOOL_CONFIG_H 6 #include "nbtool_config.h" 7 #endif 8 9 #ifdef HAVE_CONFIG_H 10 #include <config.h> 11 #endif 12 13 #include <limits.h> 14 #include <stdlib.h> 15 #include <string.h> 16 #include <errno.h> 17 #include <assert.h> 18 #include <ctype.h> 19 #include <stdio.h> 20 21 #if defined(__cplusplus) /* __cplusplus, etc. */ 22 #define class myClass 23 #endif 24 25 #define YYMAJOR 2 26 #define YYMINOR 0 27 28 #define CONCAT(first,second) first #second 29 #define CONCAT1(string,number) CONCAT(string, number) 30 #define CONCAT2(first,second) #first "." #second 31 32 #ifdef YYPATCH 33 #define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH) 34 #else 35 #define VSTRING(a,b) CONCAT2(a,b) 36 #endif 37 38 #define VERSION VSTRING(YYMAJOR, YYMINOR) 39 40 /* machine-dependent definitions: */ 41 42 /* MAXCHAR is the largest unsigned character value */ 43 /* MAXTABLE is the maximum table size */ 44 /* YYINT is the smallest C integer type that can be */ 45 /* used to address a table of size MAXTABLE */ 46 /* MAXYYINT is the largest value of a YYINT */ 47 /* MINYYINT is the most negative value of a YYINT */ 48 /* BITS_PER_WORD is the number of bits in a C unsigned */ 49 /* WORDSIZE computes the number of words needed to */ 50 /* store n bits */ 51 /* BIT returns the value of the n-th bit starting */ 52 /* from r (0-indexed) */ 53 /* SETBIT sets the n-th bit starting from r */ 54 55 #define MAXCHAR UCHAR_MAX 56 #ifndef MAXTABLE 57 #define MAXTABLE INT_MAX 58 #endif 59 #if MAXTABLE <= SHRT_MAX 60 #define YYINT short 61 #define MAXYYINT SHRT_MAX 62 #define MINYYINT SHRT_MIN 63 #elif MAXTABLE <= INT_MAX 64 #define YYINT int 65 #define MAXYYINT INT_MAX 66 #define MINYYINT INT_MIN 67 #elif MAXTABLE <= LONG_MAX 68 #define YYINT long 69 #define MAXYYINT LONG_MAX 70 #define MINYYINT LONG_MIN 71 #else 72 #error "MAXTABLE is too large for this machine architecture!" 73 #endif 74 75 #define BITS_PER_WORD ((int) sizeof (unsigned) * CHAR_BIT) 76 #define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) 77 #define BIT(r, n) ((((r)[(n)/BITS_PER_WORD])>>((n)&(BITS_PER_WORD-1)))&1) 78 #define SETBIT(r, n) ((r)[(n)/BITS_PER_WORD]|=((unsigned)1<<((n)&(BITS_PER_WORD-1)))) 79 80 /* character names */ 81 82 #define NUL '\0' /* the null character */ 83 #define NEWLINE '\n' /* line feed */ 84 #define SP ' ' /* space */ 85 #define BS '\b' /* backspace */ 86 #define HT '\t' /* horizontal tab */ 87 #define VT '\013' /* vertical tab */ 88 #define CR '\r' /* carriage return */ 89 #define FF '\f' /* form feed */ 90 #define QUOTE '\'' /* single quote */ 91 #define DOUBLE_QUOTE '\"' /* double quote */ 92 #define BACKSLASH '\\' /* backslash */ 93 94 #define UCH(c) (unsigned char)(c) 95 96 /* defines for constructing filenames */ 97 98 #if defined(VMS) 99 #define CODE_SUFFIX "_code.c" 100 #define DEFINES_SUFFIX "_tab.h" 101 #define EXTERNS_SUFFIX "_tab.i" 102 #define OUTPUT_SUFFIX "_tab.c" 103 #else 104 #define CODE_SUFFIX ".code.c" 105 #define DEFINES_SUFFIX ".tab.h" 106 #define EXTERNS_SUFFIX ".tab.i" 107 #define OUTPUT_SUFFIX ".tab.c" 108 #endif 109 #define VERBOSE_SUFFIX ".output" 110 #define GRAPH_SUFFIX ".dot" 111 112 /* keyword codes */ 113 114 typedef enum 115 { 116 TOKEN = 0 117 ,LEFT 118 ,RIGHT 119 ,NONASSOC 120 ,MARK 121 ,TEXT 122 ,TYPE 123 ,START 124 ,UNION 125 ,IDENT 126 127 /* trivial bison "extensions" which have POSIX equivalents */ 128 ,NONPOSIX_DEBUG 129 130 /* other bison "extensions", some useful */ 131 ,HACK_DEFINE 132 ,ERROR_VERBOSE 133 ,EXPECT 134 ,EXPECT_RR 135 ,LEX_PARAM 136 ,PARSE_PARAM 137 ,POSIX_YACC 138 ,PURE_PARSER 139 ,TOKEN_TABLE 140 ,XCODE 141 142 #if defined(YYBTYACC) 143 ,DESTRUCTOR 144 ,INITIAL_ACTION 145 ,LOCATIONS 146 #endif 147 } 148 KEY_CASES; 149 150 /* symbol classes */ 151 152 typedef enum 153 { 154 UNKNOWN = 0 155 ,TERM 156 ,NONTERM 157 ,ACTION 158 ,ARGUMENT 159 } 160 SYM_CASES; 161 162 /* the undefined value */ 163 164 #define UNDEFINED (-1) 165 166 /* action codes */ 167 168 #define SHIFT 1 169 #define REDUCE 2 170 171 /* character macros */ 172 173 #define IS_NAME1(c) (isalpha(UCH(c)) || (c) == '_' || (c) == '$') 174 #define IS_NAME2(c) (isalnum(UCH(c)) || (c) == '_' || (c) == '$') 175 #define IS_IDENT(c) (isalnum(UCH(c)) || (c) == '_' || (c) == '.' || (c) == '$') 176 #define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') 177 178 /* symbol macros */ 179 180 #define ISTOKEN(s) ((s) < start_symbol) 181 #define ISVAR(s) ((s) >= start_symbol) 182 183 /* storage allocation macros */ 184 185 #define CALLOC(k,n) (calloc((size_t)(k),(size_t)(n))) 186 #define FREE(x) (free((char*)(x))) 187 #define MALLOC(n) (malloc((size_t)(n))) 188 #define TCMALLOC(t,n) ((t*) calloc((size_t)(n), sizeof(t))) 189 #define TMALLOC(t,n) ((t*) malloc((size_t)(n) * sizeof(t))) 190 #define NEW(t) ((t*)allocate(sizeof(t))) 191 #define NEW2(n,t) ((t*)allocate(((size_t)(n)*sizeof(t)))) 192 #define REALLOC(p,n) (realloc((char*)(p),(size_t)(n))) 193 #define TREALLOC(t,p,n) ((t*)realloc((char*)(p), (size_t)(n) * sizeof(t))) 194 195 #define DO_FREE(x) if (x) { FREE(x); x = 0; } 196 197 #define NO_SPACE(p) do { if (p == 0) on_error(); assert(p != 0); } while (0) 198 199 /* messages */ 200 #define PLURAL(n) ((n) > 1 ? "s" : "") 201 202 /* 203 * Features which depend indirectly on the btyacc configuration, but are not 204 * essential. 205 */ 206 #if defined(YYBTYACC) 207 #define USE_HEADER_GUARDS 1 208 #else 209 #define USE_HEADER_GUARDS 0 210 #endif 211 212 typedef char Assoc_t; 213 typedef char Class_t; 214 typedef YYINT Index_t; 215 typedef YYINT Value_t; 216 217 /* the structure of a symbol table entry */ 218 219 typedef struct bucket bucket; 220 struct bucket 221 { 222 struct bucket *link; 223 struct bucket *next; 224 char *name; 225 char *tag; 226 #if defined(YYBTYACC) 227 char **argnames; 228 char **argtags; 229 int args; 230 char *destructor; 231 #endif 232 Value_t value; 233 Index_t index; 234 Value_t prec; 235 Class_t class; 236 Assoc_t assoc; 237 }; 238 239 /* the structure of the LR(0) state machine */ 240 241 typedef struct core core; 242 struct core 243 { 244 struct core *next; 245 struct core *link; 246 Value_t number; 247 Value_t accessing_symbol; 248 Value_t nitems; 249 Value_t items[1]; 250 }; 251 252 /* the structure used to record shifts */ 253 254 typedef struct shifts shifts; 255 struct shifts 256 { 257 struct shifts *next; 258 Value_t number; 259 Value_t nshifts; 260 Value_t shift[1]; 261 }; 262 263 /* the structure used to store reductions */ 264 265 typedef struct reductions reductions; 266 struct reductions 267 { 268 struct reductions *next; 269 Value_t number; 270 Value_t nreds; 271 Value_t rules[1]; 272 }; 273 274 /* the structure used to represent parser actions */ 275 276 typedef struct action action; 277 struct action 278 { 279 struct action *next; 280 Value_t symbol; 281 Value_t number; 282 Value_t prec; 283 char action_code; 284 Assoc_t assoc; 285 char suppressed; 286 }; 287 288 /* the structure used to store parse/lex parameters */ 289 typedef struct param param; 290 struct param 291 { 292 struct param *next; 293 char *name; /* parameter name */ 294 char *type; /* everything before parameter name */ 295 char *type2; /* everything after parameter name */ 296 }; 297 298 /* global variables */ 299 300 extern char dflag2; 301 extern char dflag; 302 extern char gflag; 303 extern char iflag; 304 extern char lflag; 305 extern char rflag; 306 extern char sflag; 307 extern char tflag; 308 extern char vflag; 309 extern const char *symbol_prefix; 310 311 extern const char *myname; 312 extern char *cptr; 313 extern char *line; 314 extern int lineno; 315 extern int outline; 316 extern int exit_code; 317 extern int pure_parser; 318 extern int token_table; 319 extern int error_verbose; 320 #if defined(YYBTYACC) 321 extern int locations; 322 extern int backtrack; 323 extern int destructor; 324 extern char *initial_action; 325 #endif 326 327 extern const char *const banner[]; 328 extern const char *const xdecls[]; 329 extern const char *const tables[]; 330 extern const char *const global_vars[]; 331 extern const char *const impure_vars[]; 332 extern const char *const hdr_defs[]; 333 extern const char *const hdr_vars[]; 334 extern const char *const body_1[]; 335 extern const char *const body_vars[]; 336 extern const char *const init_vars[]; 337 extern const char *const body_2[]; 338 extern const char *const body_3[]; 339 extern const char *const trailer[]; 340 341 extern char *code_file_name; 342 extern char *input_file_name; 343 extern size_t input_file_name_len; 344 extern char *defines_file_name; 345 extern char *externs_file_name; 346 347 extern FILE *action_file; 348 extern FILE *code_file; 349 extern FILE *defines_file; 350 extern FILE *externs_file; 351 extern FILE *input_file; 352 extern FILE *output_file; 353 extern FILE *text_file; 354 extern FILE *union_file; 355 extern FILE *verbose_file; 356 extern FILE *graph_file; 357 358 extern Value_t nitems; 359 extern Value_t nrules; 360 extern Value_t nsyms; 361 extern Value_t ntokens; 362 extern Value_t nvars; 363 extern int ntags; 364 365 extern char unionized; 366 extern char line_format[]; 367 368 #define fprintf_lineno(f, n, s) \ 369 if (!lflag) \ 370 fprintf(f, line_format, (n), (s) ? (s) : "(null)") 371 372 extern Value_t start_symbol; 373 extern char **symbol_name; 374 extern char **symbol_pname; 375 extern Value_t *symbol_value; 376 extern Value_t *symbol_prec; 377 extern char *symbol_assoc; 378 379 #if defined(YYBTYACC) 380 extern Value_t *symbol_pval; 381 extern char **symbol_destructor; 382 extern char **symbol_type_tag; 383 #endif 384 385 extern Value_t *ritem; 386 extern Value_t *rlhs; 387 extern Value_t *rrhs; 388 extern Value_t *rprec; 389 extern Assoc_t *rassoc; 390 391 extern Value_t **derives; 392 extern char *nullable; 393 394 extern bucket *first_symbol; 395 extern bucket *last_symbol; 396 397 extern Value_t nstates; 398 extern core *first_state; 399 extern shifts *first_shift; 400 extern reductions *first_reduction; 401 extern Value_t *accessing_symbol; 402 extern core **state_table; 403 extern shifts **shift_table; 404 extern reductions **reduction_table; 405 extern unsigned *LA; 406 extern Value_t *LAruleno; 407 extern Value_t *lookaheads; 408 extern Value_t *goto_base; 409 extern Value_t *goto_map; 410 extern Value_t *from_state; 411 extern Value_t *to_state; 412 413 extern action **parser; 414 extern int SRexpect; 415 extern int RRexpect; 416 extern int SRtotal; 417 extern int RRtotal; 418 extern Value_t *SRconflicts; 419 extern Value_t *RRconflicts; 420 extern Value_t *defred; 421 extern Value_t *rules_used; 422 extern Value_t nunused; 423 extern Value_t final_state; 424 425 extern Value_t *itemset; 426 extern Value_t *itemsetend; 427 extern unsigned *ruleset; 428 429 extern param *lex_param; 430 extern param *parse_param; 431 432 /* global functions */ 433 434 #ifdef HAVE_STDNORETURN_H 435 #undef GCC_NORETURN 436 #include <stdnoreturn.h> 437 #define GCC_NORETURN _Noreturn 438 #endif 439 440 #ifndef GCC_NORETURN 441 #if defined(_MSC_VER) 442 #define GCC_NORETURN __declspec(noreturn) 443 #else 444 #define GCC_NORETURN /* nothing */ 445 #endif 446 #endif 447 448 #if defined(NDEBUG) && defined(_MSC_VER) 449 #define NODEFAULT __assume(0); 450 #else 451 #define NODEFAULT 452 #endif 453 #define NOTREACHED NODEFAULT 454 455 #ifndef GCC_UNUSED 456 #if defined(__unused) 457 #define GCC_UNUSED __unused 458 #else 459 #define GCC_UNUSED /* nothing */ 460 #endif 461 #endif 462 463 #ifndef GCC_PRINTFLIKE 464 #define GCC_PRINTFLIKE(fmt,var) /*nothing */ 465 #endif 466 467 /* closure.c */ 468 extern void closure(Value_t *nucleus, int n); 469 extern void finalize_closure(void); 470 extern void set_first_derives(void); 471 472 /* error.c */ 473 struct ainfo 474 { 475 int a_lineno; 476 char *a_line; 477 char *a_cptr; 478 }; 479 480 extern void arg_number_disagree_warning(int a_lineno, const char *a_name); 481 extern void arg_type_disagree_warning(int a_lineno, int i, const char *a_name); 482 extern GCC_NORETURN void at_error(int a_lineno, const char *a_line, const char *a_cptr); 483 extern void at_warning(int a_lineno, int i); 484 extern GCC_NORETURN void bad_formals(void); 485 extern void default_action_warning(const char *s); 486 extern void destructor_redeclared_warning(const struct ainfo *); 487 extern void dislocations_warning(void); 488 extern GCC_NORETURN void dollar_error(int a_lineno, const char *a_line, const char *a_cptr); 489 extern void dollar_warning(int a_lineno, int i); 490 extern GCC_NORETURN void fatal(const char *msg); 491 extern GCC_NORETURN void illegal_character(const char *c_cptr); 492 extern GCC_NORETURN void illegal_tag(int t_lineno, const char *t_line, const char *t_cptr); 493 extern GCC_NORETURN void missing_brace(void); 494 extern GCC_NORETURN void no_grammar(void); 495 extern GCC_NORETURN void on_error(void); 496 extern GCC_NORETURN void open_error(const char *filename); 497 extern GCC_NORETURN void over_unionized(const char *u_cptr); 498 extern void prec_redeclared(void); 499 extern void reprec_warning(const char *s); 500 extern void restarted_warning(void); 501 extern void retyped_warning(const char *s); 502 extern void revalued_warning(const char *s); 503 extern void start_requires_args(const char *a_name); 504 extern GCC_NORETURN void syntax_error(int st_lineno, const char *st_line, const char *st_cptr); 505 extern GCC_NORETURN void terminal_lhs(int s_lineno); 506 extern GCC_NORETURN void terminal_start(const char *s); 507 extern GCC_NORETURN void tokenized_start(const char *s); 508 extern GCC_NORETURN void undefined_goal(const char *s); 509 extern void undefined_symbol_warning(const char *s); 510 extern GCC_NORETURN void unexpected_EOF(void); 511 extern void unknown_arg_warning(int d_lineno, 512 const char *dlr_opt, 513 const char *d_arg, 514 const char *d_line, 515 const char *d_cptr); 516 extern GCC_NORETURN void unknown_rhs(int i); 517 extern void unsupported_flag_warning(const char *flag, const char *details); 518 extern GCC_NORETURN void unexpected_value(const struct ainfo *); 519 extern GCC_NORETURN void unterminated_action(const struct ainfo *); 520 extern GCC_NORETURN void unterminated_comment(const struct ainfo *); 521 extern GCC_NORETURN void unterminated_string(const struct ainfo *); 522 extern GCC_NORETURN void unterminated_text(const struct ainfo *); 523 extern GCC_NORETURN void unterminated_union(const struct ainfo *); 524 extern void untyped_arg_warning(int a_lineno, const char *dlr_opt, const char *a_name); 525 extern GCC_NORETURN void untyped_lhs(void); 526 extern GCC_NORETURN void untyped_rhs(int i, const char *s); 527 extern GCC_NORETURN void used_reserved(const char *s); 528 extern GCC_NORETURN void unterminated_arglist(const struct ainfo *); 529 extern void wrong_number_args_warning(const char *which, const char *a_name); 530 extern void wrong_type_for_arg_warning(int i, const char *a_name); 531 532 /* graph.c */ 533 extern void graph(void); 534 535 /* lalr.c */ 536 extern void lalr(void); 537 538 /* lr0.c */ 539 extern void lr0(void); 540 extern void show_cores(void); 541 extern void show_ritems(void); 542 extern void show_rrhs(void); 543 extern void show_shifts(void); 544 545 /* main.c */ 546 extern void *allocate(size_t n); 547 extern GCC_NORETURN void done(int k); 548 549 /* mkpar.c */ 550 extern void free_parser(void); 551 extern void make_parser(void); 552 553 /* mstring.c */ 554 struct mstring 555 { 556 char *base, *ptr, *end; 557 }; 558 559 extern void msprintf(struct mstring *, const char *, ...) GCC_PRINTFLIKE(2,3); 560 extern int mputchar(struct mstring *, int); 561 extern struct mstring *msnew(void); 562 extern struct mstring *msrenew(char *); 563 extern char *msdone(struct mstring *); 564 extern int strnscmp(const char *, const char *); 565 extern unsigned int strnshash(const char *); 566 567 #define mputc(m, ch) (((m)->ptr == (m)->end) \ 568 ? mputchar(m,ch) \ 569 : (*(m)->ptr++ = (char) (ch))) 570 571 /* output.c */ 572 extern void output(void); 573 574 /* reader.c */ 575 extern void reader(void); 576 577 typedef enum 578 { 579 CODE_HEADER = 0 580 ,CODE_REQUIRES 581 ,CODE_PROVIDES 582 ,CODE_TOP 583 ,CODE_IMPORTS 584 ,CODE_MAX /* this must be last */ 585 } 586 CODE_CASES; 587 extern struct code_lines 588 { 589 const char *name; 590 char *lines; 591 size_t num; 592 } 593 code_lines[CODE_MAX]; 594 595 /* skeleton.c (generated by skel2c) */ 596 extern void write_section(FILE * fp, const char *const section[]); 597 598 /* symtab.c */ 599 extern bucket *make_bucket(const char *); 600 extern bucket *lookup(const char *); 601 extern void create_symbol_table(void); 602 extern void free_symbol_table(void); 603 extern void free_symbols(void); 604 605 /* verbose.c */ 606 extern void verbose(void); 607 608 /* warshall.c */ 609 extern void reflexive_transitive_closure(unsigned *R, int n); 610 611 #ifdef DEBUG 612 /* closure.c */ 613 extern void print_closure(int n); 614 extern void print_EFF(void); 615 extern void print_first_derives(void); 616 /* lr0.c */ 617 extern void print_derives(void); 618 #endif 619 620 #ifdef NO_LEAKS 621 extern void lr0_leaks(void); 622 extern void lalr_leaks(void); 623 extern void mkpar_leaks(void); 624 extern void output_leaks(void); 625 extern void mstring_leaks(void); 626 extern void reader_leaks(void); 627 #endif 628