1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
|
#if __STDC__ || defined(__cplusplus)
#define _P_(s) s
#else
#define _P_(s) ()
#endif
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#if __STDC__
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <limits.h>
#ifdef _AMIGA
#define AMIGA
#endif
#endif
/* machine-dependent definitions */
/* the following definitions are for the Tahoe */
/* they might have to be changed for other machines */
/* MAXCHAR is the largest unsigned character value */
/* MAXSHORT is the largest value of a C short */
/* MINSHORT is the most negative value of a C short */
/* MAXTABLE is the maximum table size */
/* BITS_PER_WORD is the number of bits in a C unsigned */
/* WORDSIZE computes the number of words needed to */
/* store n bits */
/* BIT returns the value of the n-th bit starting */
/* from r (0-indexed) */
/* SETBIT sets the n-th bit starting from r */
#ifdef AMIGA
#define MAXCHAR UCHAR_MAX
#define MAXSHORT SHRT_MAX
#define MINSHORT SHRT_MIN
#else
#define MAXCHAR 255
#define MAXSHORT 32767
#define MINSHORT -32768
#endif
#define MAXTABLE 32500
#define BITS_PER_WORD 32
#define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD)
#define BIT(r, n) ((((r)[(n)>>5])>>((n)&31))&1)
#define SETBIT(r, n) ((r)[(n)>>5]|=((unsigned)1<<((n)&31)))
/* character names */
#define NUL '\0' /* the null character */
#define NEWLINE '\n' /* line feed */
#define SP ' ' /* space */
#define BS '\b' /* backspace */
#define HT '\t' /* horizontal tab */
#define VT '\013' /* vertical tab */
#define CR '\r' /* carriage return */
#define FF '\f' /* form feed */
#define QUOTE '\'' /* single quote */
#define DOUBLE_QUOTE '\"' /* double quote */
#define BACKSLASH '\\' /* backslash */
/* defines for constructing filenames */
#define CODE_SUFFIX 0
#define DEFINES_SUFFIX 1
#define OUTPUT_SUFFIX 2
#define VERBOSE_SUFFIX 3
/* keyword codes */
#define TOKEN 0
#define LEFT 1
#define RIGHT 2
#define NONASSOC 3
#define MARK 4
#define TEXT 5
#define TYPE 6
#define START 7
#define UNION 8
#define IDENT 9
/* symbol classes */
#define UNKNOWN 0
#define TERM 1
#define NONTERM 2
/* the undefined value */
#define UNDEFINED (-1)
/* action codes */
#define SHIFT 1
#define REDUCE 2
/* character macros */
#define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$')
#define IS_OCTAL(c) ((c) >= '0' && (c) <= '7')
#define NUMERIC_VALUE(c) ((c) - '0')
/* symbol macros */
#define ISTOKEN(s) ((s) < start_symbol)
#define ISVAR(s) ((s) >= start_symbol)
/* storage allocation macros */
#define CALLOC(k,n) (my_calloc((unsigned)(k),(unsigned)(n)))
#define FREE(x) (free((char*)(x)))
#define MALLOC(n) (my_malloc((unsigned)(n)))
#define NEW(t) ((t*)allocate(sizeof(t)))
#define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t))))
#define REALLOC(p,n) (my_realloc((char*)(p),(unsigned)(n)))
/* the structure of a symbol table entry */
typedef struct bucket bucket;
struct bucket
{
struct bucket *link;
struct bucket *next;
char *name;
char *tag;
short value;
short index;
short prec;
char class;
char assoc;
};
/* the structure of the LR(0) state machine */
typedef struct core core;
struct core
{
struct core *next;
struct core *link;
short number;
short accessing_symbol;
short nitems;
short items[1];
};
/* the structure used to record shifts */
typedef struct shifts shifts;
struct shifts
{
struct shifts *next;
short number;
short nshifts;
short shift[1];
};
/* the structure used to store reductions */
typedef struct reductions reductions;
struct reductions
{
struct reductions *next;
short number;
short nreds;
short rules[1];
};
/* the structure used to represent parser actions */
typedef struct action action;
struct action
{
struct action *next;
short symbol;
short number;
short prec;
char action_code;
char assoc;
char suppressed;
};
/* target language is one of these */
typedef enum { C, PERL } Language;
/* global variables */
extern char dflag;
extern char lflag;
extern char rflag;
extern char tflag;
extern char vflag;
extern char perl5005flag;
extern Language language;
extern char *myname;
extern char *cptr;
extern char *line;
extern int lineno;
extern int outline;
extern char **banner[];
extern char **tables[];
extern char **header[];
extern char **body[];
extern char **trailer[];
extern int prefix_changed;
extern char *define_prefix;
extern char *symbol_prefix;
extern char *perl_package;
extern char *action_file_name;
extern char *code_file_name;
extern char *defines_file_name;
extern char *input_file_name;
extern char *output_file_name;
extern char *text_file_name;
extern char *union_file_name;
extern char *verbose_file_name;
extern FILE *action_file;
extern FILE *code_file;
extern FILE *defines_file;
extern FILE *input_file;
extern FILE *output_file;
extern FILE *text_file;
extern FILE *union_file;
extern FILE *verbose_file;
extern int nitems;
extern int nrules;
extern int nsyms;
extern int ntokens;
extern int nvars;
extern int ntags;
extern char unionized;
extern char line_format[];
extern int start_symbol;
extern char **symbol_name;
extern short *symbol_value;
extern short *symbol_prec;
extern char *symbol_assoc;
extern short *ritem;
extern short *rlhs;
extern short *rrhs;
extern short *rprec;
extern char *rassoc;
extern short **derives;
extern char *nullable;
extern bucket *first_symbol;
extern bucket *last_symbol;
extern int nstates;
extern core *first_state;
extern shifts *first_shift;
extern reductions *first_reduction;
extern short *accessing_symbol;
extern core **state_table;
extern shifts **shift_table;
extern reductions **reduction_table;
extern unsigned *LA;
extern short *LAruleno;
extern short *lookaheads;
extern short *goto_map;
extern short *from_state;
extern short *to_state;
extern action **parser;
extern int SRtotal;
extern int RRtotal;
extern short *SRconflicts;
extern short *RRconflicts;
extern short *defred;
extern short *rules_used;
extern short nunused;
extern short final_state;
/* global functions */
extern char * allocate _P_((unsigned n));
extern void closure _P_((short *nucleus, int n));
extern void create_symbol_table _P_((void));
extern void default_action_warning _P_((void));
extern void dollar_error _P_((int a_lineno, char *a_line, char *a_cptr));
extern void dollar_warning _P_((int a_lineno, int i));
extern void done _P_((int k));
extern void fatal _P_((char *msg));
extern void finalize_closure _P_((void));
extern void free_derives _P_((void));
extern void free_nullable _P_((void));
extern void free_parser _P_((void));
extern void free_symbol_table _P_((void));
extern void free_symbols _P_((void));
extern void illegal_character _P_((char *c_cptr));
extern void illegal_tag _P_((int t_lineno, char *t_line, char *t_cptr));
extern void lalr _P_((void));
extern bucket * lookup _P_((char *name));
extern void lr0 _P_((void));
extern bucket * make_bucket _P_((char *name));
extern void make_parser _P_((void));
extern char * my_calloc _P_((unsigned k, unsigned n));
extern char * my_malloc _P_((unsigned n));
extern char * my_realloc _P_((char *p, unsigned n));
extern void no_grammar _P_((void));
extern void no_space _P_((void));
extern void open_error _P_((char *filename));
extern void output _P_((void));
extern void over_unionized _P_((char *u_cptr));
extern void prec_redeclared _P_((void));
extern void print_pos _P_((char *st_line, char *st_cptr));
extern void reader _P_((void));
extern void reflexive_transitive_closure _P_((unsigned *R, int n));
extern void reprec_warning _P_((char *s));
extern void restarted_warning _P_((void));
extern void retyped_warning _P_((char *s));
extern void revalued_warning _P_((char *s));
extern void set_first_derives _P_((void));
extern void syntax_error _P_((int st_lineno, char *st_line, char *st_cptr));
extern void terminal_lhs _P_((int s_lineno));
extern void terminal_start _P_((char *s));
extern void tokenized_start _P_((char *s));
extern void undefined_goal _P_((char *s));
extern void undefined_symbol_warning _P_((char *s));
extern void unexpected_EOF _P_((void));
extern void unknown_rhs _P_((int i));
extern void unterminated_action _P_((int a_lineno, char *a_line, char *a_cptr));
extern void unterminated_comment _P_((int c_lineno, char *c_line, char *c_cptr));
extern void unterminated_string _P_((int s_lineno, char *s_line, char *s_cptr));
extern void unterminated_text _P_((int t_lineno, char *t_line, char *t_cptr));
extern void unterminated_union _P_((int u_lineno, char *u_line, char *u_cptr));
extern void untyped_lhs _P_((void));
extern void untyped_rhs _P_((int i, char *s));
extern void used_reserved _P_((char *s));
extern void verbose _P_((void));
extern void write_section _P_((char **section[]));
/* system variables */
extern int errno;
/* system functions */
#if __STDC__ != 1
extern void free();
extern char *strcpy();
extern char *strrchr();
#endif
|