defs.h revision 234949
1234949Sbapt/* $Id: defs.h,v 1.36 2011/12/20 01:31:16 tom Exp $ */ 2234949Sbapt 3234949Sbapt#ifdef HAVE_CONFIG_H 4234949Sbapt#include <config.h> 5234949Sbapt#endif 6234949Sbapt 7234949Sbapt#include <stdlib.h> 8234949Sbapt#include <string.h> 9234949Sbapt#include <errno.h> 10234949Sbapt#include <assert.h> 11234949Sbapt#include <ctype.h> 12234949Sbapt#include <stdio.h> 13234949Sbapt 14234949Sbapt#define YYMAJOR 1 15234949Sbapt#define YYMINOR 9 16234949Sbapt 17234949Sbapt#define CONCAT(first,second) first #second 18234949Sbapt#define CONCAT1(string,number) CONCAT(string, number) 19234949Sbapt#define CONCAT2(first,second) #first "." #second 20234949Sbapt 21234949Sbapt#ifdef YYPATCH 22234949Sbapt#define VSTRING(a,b) CONCAT2(a,b) CONCAT1(" ",YYPATCH) 23234949Sbapt#else 24234949Sbapt#define VSTRING(a,b) CONCAT2(a,b) 25234949Sbapt#endif 26234949Sbapt 27234949Sbapt#define VERSION VSTRING(YYMAJOR, YYMINOR) 28234949Sbapt 29234949Sbapt/* machine-dependent definitions */ 30234949Sbapt/* the following definitions are for the Tahoe */ 31234949Sbapt/* they might have to be changed for other machines */ 32234949Sbapt 33234949Sbapt/* MAXCHAR is the largest unsigned character value */ 34234949Sbapt/* MAXSHORT is the largest value of a C short */ 35234949Sbapt/* MINSHORT is the most negative value of a C short */ 36234949Sbapt/* MAXTABLE is the maximum table size */ 37234949Sbapt/* BITS_PER_WORD is the number of bits in a C unsigned */ 38234949Sbapt/* WORDSIZE computes the number of words needed to */ 39234949Sbapt/* store n bits */ 40234949Sbapt/* BIT returns the value of the n-th bit starting */ 41234949Sbapt/* from r (0-indexed) */ 42234949Sbapt/* SETBIT sets the n-th bit starting from r */ 43234949Sbapt 44234949Sbapt#define MAXCHAR 255 45234949Sbapt#define MAXSHORT 32767 46234949Sbapt#define MINSHORT -32768 47234949Sbapt#define MAXTABLE 32500 48234949Sbapt#define BITS_PER_WORD 32 49234949Sbapt#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) 50234949Sbapt#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1) 51234949Sbapt#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31))) 52234949Sbapt 53234949Sbapt/* character names */ 54234949Sbapt 55234949Sbapt#define NUL '\0' /* the null character */ 56234949Sbapt#define NEWLINE '\n' /* line feed */ 57234949Sbapt#define SP ' ' /* space */ 58234949Sbapt#define BS '\b' /* backspace */ 59234949Sbapt#define HT '\t' /* horizontal tab */ 60234949Sbapt#define VT '\013' /* vertical tab */ 61234949Sbapt#define CR '\r' /* carriage return */ 62234949Sbapt#define FF '\f' /* form feed */ 63234949Sbapt#define QUOTE '\'' /* single quote */ 64234949Sbapt#define DOUBLE_QUOTE '\"' /* double quote */ 65234949Sbapt#define BACKSLASH '\\' /* backslash */ 66234949Sbapt 67234949Sbapt#define UCH(c) (unsigned char)(c) 68234949Sbapt 69234949Sbapt/* defines for constructing filenames */ 70234949Sbapt 71234949Sbapt#if defined(VMS) 72234949Sbapt#define CODE_SUFFIX "_code.c" 73234949Sbapt#define DEFINES_SUFFIX "_tab.h" 74234949Sbapt#define EXTERNS_SUFFIX "_tab.i" 75234949Sbapt#define OUTPUT_SUFFIX "_tab.c" 76234949Sbapt#else 77234949Sbapt#define CODE_SUFFIX ".code.c" 78234949Sbapt#define DEFINES_SUFFIX ".tab.h" 79234949Sbapt#define EXTERNS_SUFFIX ".tab.i" 80234949Sbapt#define OUTPUT_SUFFIX ".tab.c" 81234949Sbapt#endif 82234949Sbapt#define VERBOSE_SUFFIX ".output" 83234949Sbapt#define GRAPH_SUFFIX ".dot" 84234949Sbapt 85234949Sbapt/* keyword codes */ 86234949Sbapt 87234949Sbapt#define TOKEN 0 88234949Sbapt#define LEFT 1 89234949Sbapt#define RIGHT 2 90234949Sbapt#define NONASSOC 3 91234949Sbapt#define MARK 4 92234949Sbapt#define TEXT 5 93234949Sbapt#define TYPE 6 94234949Sbapt#define START 7 95234949Sbapt#define UNION 8 96234949Sbapt#define IDENT 9 97234949Sbapt#define EXPECT 10 98234949Sbapt#define EXPECT_RR 11 99234949Sbapt#define PURE_PARSER 12 100234949Sbapt#define PARSE_PARAM 13 101234949Sbapt#define LEX_PARAM 14 102234949Sbapt#define POSIX_YACC 15 103234949Sbapt 104234949Sbapt/* symbol classes */ 105234949Sbapt 106234949Sbapt#define UNKNOWN 0 107234949Sbapt#define TERM 1 108234949Sbapt#define NONTERM 2 109234949Sbapt 110234949Sbapt/* the undefined value */ 111234949Sbapt 112234949Sbapt#define UNDEFINED (-1) 113234949Sbapt 114234949Sbapt/* action codes */ 115234949Sbapt 116234949Sbapt#define SHIFT 1 117234949Sbapt#define REDUCE 2 118234949Sbapt 119234949Sbapt/* character macros */ 120234949Sbapt 121234949Sbapt#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') 122234949Sbapt#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') 123234949Sbapt#define NUMERIC_VALUE(c) ((c) - '0') 124234949Sbapt 125234949Sbapt/* symbol macros */ 126234949Sbapt 127234949Sbapt#define ISTOKEN(s) ((s) < start_symbol) 128234949Sbapt#define ISVAR(s) ((s) >= start_symbol) 129234949Sbapt 130234949Sbapt/* storage allocation macros */ 131234949Sbapt 132234949Sbapt#define CALLOC(k,n) (calloc((size_t)(k),(size_t)(n))) 133234949Sbapt#define FREE(x) (free((char*)(x))) 134234949Sbapt#define MALLOC(n) (malloc((size_t)(n))) 135234949Sbapt#define NEW(t) ((t*)allocate(sizeof(t))) 136234949Sbapt#define NEW2(n,t) ((t*)allocate(((size_t)(n)*sizeof(t)))) 137234949Sbapt#define REALLOC(p,n) (realloc((char*)(p),(size_t)(n))) 138234949Sbapt 139234949Sbapt#define DO_FREE(x) if (x) { FREE(x); x = 0; } 140234949Sbapt 141234949Sbapt#define NO_SPACE(p) if (p == 0) no_space(); assert(p != 0) 142234949Sbapt 143234949Sbapt/* messages */ 144234949Sbapt#define PLURAL(n) ((n) > 1 ? "s" : "") 145234949Sbapt 146234949Sbapttypedef char Assoc_t; 147234949Sbapttypedef char Class_t; 148234949Sbapttypedef short Index_t; 149234949Sbapttypedef short Value_t; 150234949Sbapt 151234949Sbapt/* the structure of a symbol table entry */ 152234949Sbapt 153234949Sbapttypedef struct bucket bucket; 154234949Sbaptstruct bucket 155234949Sbapt{ 156234949Sbapt struct bucket *link; 157234949Sbapt struct bucket *next; 158234949Sbapt char *name; 159234949Sbapt char *tag; 160234949Sbapt Value_t value; 161234949Sbapt Index_t index; 162234949Sbapt Value_t prec; 163234949Sbapt Class_t class; 164234949Sbapt Assoc_t assoc; 165234949Sbapt}; 166234949Sbapt 167234949Sbapt/* the structure of the LR(0) state machine */ 168234949Sbapt 169234949Sbapttypedef struct core core; 170234949Sbaptstruct core 171234949Sbapt{ 172234949Sbapt struct core *next; 173234949Sbapt struct core *link; 174234949Sbapt Value_t number; 175234949Sbapt Value_t accessing_symbol; 176234949Sbapt Value_t nitems; 177234949Sbapt Value_t items[1]; 178234949Sbapt}; 179234949Sbapt 180234949Sbapt/* the structure used to record shifts */ 181234949Sbapt 182234949Sbapttypedef struct shifts shifts; 183234949Sbaptstruct shifts 184234949Sbapt{ 185234949Sbapt struct shifts *next; 186234949Sbapt Value_t number; 187234949Sbapt Value_t nshifts; 188234949Sbapt Value_t shift[1]; 189234949Sbapt}; 190234949Sbapt 191234949Sbapt/* the structure used to store reductions */ 192234949Sbapt 193234949Sbapttypedef struct reductions reductions; 194234949Sbaptstruct reductions 195234949Sbapt{ 196234949Sbapt struct reductions *next; 197234949Sbapt Value_t number; 198234949Sbapt Value_t nreds; 199234949Sbapt Value_t rules[1]; 200234949Sbapt}; 201234949Sbapt 202234949Sbapt/* the structure used to represent parser actions */ 203234949Sbapt 204234949Sbapttypedef struct action action; 205234949Sbaptstruct action 206234949Sbapt{ 207234949Sbapt struct action *next; 208234949Sbapt Value_t symbol; 209234949Sbapt Value_t number; 210234949Sbapt Value_t prec; 211234949Sbapt char action_code; 212234949Sbapt Assoc_t assoc; 213234949Sbapt char suppressed; 214234949Sbapt}; 215234949Sbapt 216234949Sbapt/* the structure used to store parse/lex parameters */ 217234949Sbapttypedef struct param param; 218234949Sbaptstruct param 219234949Sbapt{ 220234949Sbapt struct param *next; 221234949Sbapt char *name; /* parameter name */ 222234949Sbapt char *type; /* everything before parameter name */ 223234949Sbapt char *type2; /* everything after parameter name */ 224234949Sbapt}; 225234949Sbapt 226234949Sbapt/* global variables */ 227234949Sbapt 228234949Sbaptextern char dflag; 229234949Sbaptextern char gflag; 230234949Sbaptextern char iflag; 231234949Sbaptextern char lflag; 232234949Sbaptextern char rflag; 233234949Sbaptextern char sflag; 234234949Sbaptextern char tflag; 235234949Sbaptextern char vflag; 236234949Sbaptextern const char *symbol_prefix; 237234949Sbapt 238234949Sbaptextern const char *myname; 239234949Sbaptextern char *cptr; 240234949Sbaptextern char *line; 241234949Sbaptextern int lineno; 242234949Sbaptextern int outline; 243234949Sbaptextern int exit_code; 244234949Sbaptextern int pure_parser; 245234949Sbapt 246234949Sbaptextern const char *const banner[]; 247234949Sbaptextern const char *const xdecls[]; 248234949Sbaptextern const char *const tables[]; 249234949Sbaptextern const char *const global_vars[]; 250234949Sbaptextern const char *const impure_vars[]; 251234949Sbaptextern const char *const hdr_defs[]; 252234949Sbaptextern const char *const hdr_vars[]; 253234949Sbaptextern const char *const body_1[]; 254234949Sbaptextern const char *const body_vars[]; 255234949Sbaptextern const char *const body_2[]; 256234949Sbaptextern const char *const body_3[]; 257234949Sbaptextern const char *const trailer[]; 258234949Sbaptextern const char *const trailer_2[]; 259234949Sbapt 260234949Sbaptextern char *code_file_name; 261234949Sbaptextern char *input_file_name; 262234949Sbaptextern char *defines_file_name; 263234949Sbaptextern char *externs_file_name; 264234949Sbapt 265234949Sbaptextern FILE *action_file; 266234949Sbaptextern FILE *code_file; 267234949Sbaptextern FILE *defines_file; 268234949Sbaptextern FILE *externs_file; 269234949Sbaptextern FILE *input_file; 270234949Sbaptextern FILE *output_file; 271234949Sbaptextern FILE *text_file; 272234949Sbaptextern FILE *union_file; 273234949Sbaptextern FILE *verbose_file; 274234949Sbaptextern FILE *graph_file; 275234949Sbapt 276234949Sbaptextern int nitems; 277234949Sbaptextern int nrules; 278234949Sbaptextern int nsyms; 279234949Sbaptextern int ntokens; 280234949Sbaptextern int nvars; 281234949Sbaptextern int ntags; 282234949Sbapt 283234949Sbaptextern char unionized; 284234949Sbaptextern char line_format[]; 285234949Sbapt 286234949Sbaptextern Value_t start_symbol; 287234949Sbaptextern char **symbol_name; 288234949Sbaptextern char **symbol_pname; 289234949Sbaptextern Value_t *symbol_value; 290234949Sbaptextern Value_t *symbol_prec; 291234949Sbaptextern char *symbol_assoc; 292234949Sbapt 293234949Sbaptextern Value_t *ritem; 294234949Sbaptextern Value_t *rlhs; 295234949Sbaptextern Value_t *rrhs; 296234949Sbaptextern Value_t *rprec; 297234949Sbaptextern Assoc_t *rassoc; 298234949Sbapt 299234949Sbaptextern Value_t **derives; 300234949Sbaptextern char *nullable; 301234949Sbapt 302234949Sbaptextern bucket *first_symbol; 303234949Sbaptextern bucket *last_symbol; 304234949Sbapt 305234949Sbaptextern int pure_parser; 306234949Sbaptextern int nstates; 307234949Sbaptextern core *first_state; 308234949Sbaptextern shifts *first_shift; 309234949Sbaptextern reductions *first_reduction; 310234949Sbaptextern Value_t *accessing_symbol; 311234949Sbaptextern core **state_table; 312234949Sbaptextern shifts **shift_table; 313234949Sbaptextern reductions **reduction_table; 314234949Sbaptextern unsigned *LA; 315234949Sbaptextern Value_t *LAruleno; 316234949Sbaptextern Value_t *lookaheads; 317234949Sbaptextern Value_t *goto_map; 318234949Sbaptextern Value_t *from_state; 319234949Sbaptextern Value_t *to_state; 320234949Sbapt 321234949Sbaptextern action **parser; 322234949Sbaptextern int SRexpect; 323234949Sbaptextern int RRexpect; 324234949Sbaptextern int SRtotal; 325234949Sbaptextern int RRtotal; 326234949Sbaptextern Value_t *SRconflicts; 327234949Sbaptextern Value_t *RRconflicts; 328234949Sbaptextern Value_t *defred; 329234949Sbaptextern Value_t *rules_used; 330234949Sbaptextern Value_t nunused; 331234949Sbaptextern Value_t final_state; 332234949Sbapt 333234949Sbaptextern Value_t *itemset; 334234949Sbaptextern Value_t *itemsetend; 335234949Sbaptextern unsigned *ruleset; 336234949Sbapt 337234949Sbaptextern param *lex_param; 338234949Sbaptextern param *parse_param; 339234949Sbapt 340234949Sbapt/* global functions */ 341234949Sbapt 342234949Sbaptextern bucket *lookup(const char *); 343234949Sbaptextern bucket *make_bucket(const char *); 344234949Sbapt 345234949Sbapt#ifndef GCC_NORETURN 346234949Sbapt#define GCC_NORETURN /* nothing */ 347234949Sbapt#endif 348234949Sbapt 349234949Sbapt#ifndef GCC_UNUSED 350234949Sbapt#define GCC_UNUSED /* nothing */ 351234949Sbapt#endif 352234949Sbapt 353234949Sbapt/* closure.c */ 354234949Sbaptextern void closure(Value_t * nucleus, int n); 355234949Sbaptextern void finalize_closure(void); 356234949Sbaptextern void set_first_derives(void); 357234949Sbapt 358234949Sbapt/* error.c */ 359234949Sbaptextern void default_action_warning(void); 360234949Sbaptextern void dollar_error(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 361234949Sbaptextern void dollar_warning(int a_lineno, int i); 362234949Sbaptextern void fatal(const char *msg) GCC_NORETURN; 363234949Sbaptextern void illegal_character(char *c_cptr) GCC_NORETURN; 364234949Sbaptextern void illegal_tag(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 365234949Sbaptextern void missing_brace(void) GCC_NORETURN; 366234949Sbaptextern void no_grammar(void) GCC_NORETURN; 367234949Sbaptextern void no_space(void) GCC_NORETURN; 368234949Sbaptextern void open_error(const char *filename) GCC_NORETURN; 369234949Sbaptextern void over_unionized(char *u_cptr) GCC_NORETURN; 370234949Sbaptextern void prec_redeclared(void); 371234949Sbaptextern void reprec_warning(char *s); 372234949Sbaptextern void restarted_warning(void); 373234949Sbaptextern void retyped_warning(char *s); 374234949Sbaptextern void revalued_warning(char *s); 375234949Sbaptextern void syntax_error(int st_lineno, char *st_line, char *st_cptr) GCC_NORETURN; 376234949Sbaptextern void terminal_lhs(int s_lineno) GCC_NORETURN; 377234949Sbaptextern void terminal_start(char *s) GCC_NORETURN; 378234949Sbaptextern void tokenized_start(char *s) GCC_NORETURN; 379234949Sbaptextern void undefined_goal(char *s) GCC_NORETURN; 380234949Sbaptextern void undefined_symbol_warning(char *s); 381234949Sbaptextern void unexpected_EOF(void) GCC_NORETURN; 382234949Sbaptextern void unknown_rhs(int i) GCC_NORETURN; 383234949Sbaptextern void unterminated_action(int a_lineno, char *a_line, char *a_cptr) GCC_NORETURN; 384234949Sbaptextern void unterminated_comment(int c_lineno, char *c_line, char *c_cptr) GCC_NORETURN; 385234949Sbaptextern void unterminated_string(int s_lineno, char *s_line, char *s_cptr) GCC_NORETURN; 386234949Sbaptextern void unterminated_text(int t_lineno, char *t_line, char *t_cptr) GCC_NORETURN; 387234949Sbaptextern void unterminated_union(int u_lineno, char *u_line, char *u_cptr) GCC_NORETURN; 388234949Sbaptextern void untyped_lhs(void) GCC_NORETURN; 389234949Sbaptextern void untyped_rhs(int i, char *s) GCC_NORETURN; 390234949Sbaptextern void used_reserved(char *s) GCC_NORETURN; 391234949Sbapt 392234949Sbapt/* graph.c */ 393234949Sbaptextern void graph(void); 394234949Sbapt 395234949Sbapt/* lalr.c */ 396234949Sbaptextern void create_symbol_table(void); 397234949Sbaptextern void free_symbol_table(void); 398234949Sbaptextern void free_symbols(void); 399234949Sbapt 400234949Sbapt/* lalr.c */ 401234949Sbaptextern void lalr(void); 402234949Sbapt 403234949Sbapt/* lr0.c */ 404234949Sbaptextern void lr0(void); 405234949Sbaptextern void show_cores(void); 406234949Sbaptextern void show_ritems(void); 407234949Sbaptextern void show_rrhs(void); 408234949Sbaptextern void show_shifts(void); 409234949Sbapt 410234949Sbapt/* main.c */ 411234949Sbaptextern void *allocate(size_t n); 412234949Sbaptextern void done(int k) GCC_NORETURN; 413234949Sbapt 414234949Sbapt/* mkpar.c */ 415234949Sbaptextern void free_parser(void); 416234949Sbaptextern void make_parser(void); 417234949Sbapt 418234949Sbapt/* output.c */ 419234949Sbaptextern void output(void); 420234949Sbapt 421234949Sbapt/* reader.c */ 422234949Sbaptextern void reader(void); 423234949Sbapt 424234949Sbapt/* skeleton.c */ 425234949Sbaptextern void write_section(FILE *fp, const char *const section[]); 426234949Sbapt 427234949Sbapt/* verbose.c */ 428234949Sbaptextern void verbose(void); 429234949Sbapt 430234949Sbapt/* warshall.c */ 431234949Sbaptextern void reflexive_transitive_closure(unsigned *R, int n); 432234949Sbapt 433234949Sbapt#ifdef NO_LEAKS 434234949Sbaptextern void lr0_leaks(void); 435234949Sbaptextern void lalr_leaks(void); 436234949Sbaptextern void mkpar_leaks(void); 437234949Sbaptextern void output_leaks(void); 438234949Sbaptextern void reader_leaks(void); 439234949Sbapt#endif 440