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