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