X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/337bab46f26130e30430789b21aa7cf44fbf7c87..be642444923af7f647e8b798999fe63763cf6270:/src/reader.c diff --git a/src/reader.c b/src/reader.c index dc49be3e..ee859b6a 100644 --- a/src/reader.c +++ b/src/reader.c @@ -63,9 +63,6 @@ static int typed; /* Incremented for each %left, %right or %nonassoc seen */ static int lastprec; -/* Incremented for each generated symbol */ -static int gensym_count; - static bucket *errtoken; static bucket *undeftoken; @@ -309,13 +306,12 @@ copy_at (FILE *fin, struct obstack *oout, int stack_offset) c = getc (fin); if (c == '$') { - obstack_grow_string (oout, "yyloc"); + obstack_sgrow (oout, "yyloc"); locations_flag = 1; } else if (isdigit (c) || c == '-') { int n; - char buf[4096]; ungetc (c, fin); n = read_signed_integer (fin); @@ -347,7 +343,7 @@ copy_dollar (FILE *fin, struct obstack *oout, symbol_list *rule, int stack_offset) { int c = getc (fin); - char *type_name = NULL; + const char *type_name = NULL; /* Get the type name if explicit. */ if (c == '<') @@ -360,7 +356,7 @@ copy_dollar (FILE *fin, struct obstack *oout, if (c == '$') { - obstack_grow_string (oout, "yyval"); + obstack_sgrow (oout, "yyval"); if (!type_name) type_name = get_type_name (0, rule); @@ -466,7 +462,7 @@ copy_definition (void) static void parse_token_decl (symbol_class what_is, symbol_class what_is_not) { - int token = 0; + token_t token = 0; char *typename = 0; /* The symbol being defined. */ @@ -486,18 +482,18 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not) fatal (_("Premature EOF after %s"), token_buffer); token = lex (); - if (token == COMMA) + if (token == tok_comma) { symbol = NULL; continue; } - if (token == TYPENAME) + if (token == tok_typename) { typename = xstrdup (token_buffer); value_components_used = 1; symbol = NULL; } - else if (token == IDENTIFIER && *symval->tag == '\"' && symbol) + else if (token == tok_identifier && *symval->tag == '\"' && symbol) { if (symval->alias) warn (_("symbol `%s' used more than once as a literal string"), @@ -519,7 +515,7 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not) translations = 1; symbol = NULL; } - else if (token == IDENTIFIER) + else if (token == tok_identifier) { int oldclass = symval->class; symbol = symval; @@ -538,7 +534,7 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not) complain (_("type redeclaration for %s"), symbol->tag); } } - else if (symbol && token == NUMBER) + else if (symbol && token == tok_number) { symbol->user_token_number = numval; translations = 1; @@ -563,7 +559,7 @@ parse_start_decl (void) { if (start_flag) complain (_("multiple %s declarations"), "%start"); - if (lex () != IDENTIFIER) + if (lex () != tok_identifier) complain (_("invalid %s declaration"), "%start"); else { @@ -582,7 +578,7 @@ parse_type_decl (void) { char *name; - if (lex () != TYPENAME) + if (lex () != tok_typename) { complain ("%s", _("%type declaration has no ")); skip_to_char ('%'); @@ -593,7 +589,7 @@ parse_type_decl (void) for (;;) { - int t; + token_t t; int tmp_char = ungetc (skip_white_space (), finput); if (tmp_char == '%') @@ -606,11 +602,11 @@ parse_type_decl (void) switch (t) { - case COMMA: - case SEMICOLON: + case tok_comma: + case tok_semicolon: break; - case IDENTIFIER: + case tok_identifier: if (symval->type_name == NULL) symval->type_name = name; else if (strcmp (name, symval->type_name) != 0) @@ -643,7 +639,7 @@ parse_assoc_decl (associativity assoc) for (;;) { - int t; + token_t t; int tmp_char = ungetc (skip_white_space (), finput); if (tmp_char == '%') @@ -655,14 +651,14 @@ parse_assoc_decl (associativity assoc) switch (t) { - case TYPENAME: + case tok_typename: name = xstrdup (token_buffer); break; - case COMMA: + case tok_comma: break; - case IDENTIFIER: + case tok_identifier: if (symval->prec != 0) complain (_("redefining precedence of %s"), symval->tag); symval->prec = lastprec; @@ -679,8 +675,8 @@ parse_assoc_decl (associativity assoc) } break; - case NUMBER: - if (prev == IDENTIFIER) + case tok_number: + if (prev == tok_identifier) { symval->user_token_number = numval; translations = 1; @@ -694,7 +690,7 @@ token_buffer); } break; - case SEMICOLON: + case tok_semicolon: return; default: @@ -732,9 +728,9 @@ parse_union_decl (void) else obstack_1grow (&attrs_obstack, '\n'); - obstack_grow_string (&attrs_obstack, "typedef union"); + obstack_sgrow (&attrs_obstack, "typedef union"); if (defines_flag) - obstack_grow_string (&defines_obstack, "typedef union"); + obstack_sgrow (&defines_obstack, "typedef union"); c = getc (finput); @@ -764,9 +760,9 @@ parse_union_decl (void) count--; if (count <= 0) { - obstack_grow_string (&attrs_obstack, " YYSTYPE;\n"); + obstack_sgrow (&attrs_obstack, " YYSTYPE;\n"); if (defines_flag) - obstack_grow_string (&defines_obstack, " YYSTYPE;\n"); + obstack_sgrow (&defines_obstack, " YYSTYPE;\n"); /* JF don't choke on trailing semi */ c = skip_white_space (); if (c != ';') @@ -821,14 +817,14 @@ parse_expect_decl (void) static void parse_thong_decl (void) { - int token; + token_t token; struct bucket *symbol; char *typename = 0; int usrtoknum; translations = 1; token = lex (); /* fetch typename or first token */ - if (token == TYPENAME) + if (token == tok_typename) { typename = xstrdup (token_buffer); value_components_used = 1; @@ -837,7 +833,7 @@ parse_thong_decl (void) /* process first token */ - if (token != IDENTIFIER) + if (token != tok_identifier) { complain (_("unrecognized item %s, expected an identifier"), token_buffer); @@ -851,7 +847,7 @@ parse_thong_decl (void) token = lex (); /* get number or literal string */ - if (token == NUMBER) + if (token == tok_number) { usrtoknum = numval; token = lex (); /* okay, did number, now get literal */ @@ -861,7 +857,7 @@ parse_thong_decl (void) /* process literal string token */ - if (token != IDENTIFIER || *symval->tag != '\"') + if (token != tok_identifier || *symval->tag != '\"') { complain (_("expected string constant instead of %s"), token_buffer); skip_to_char ('%'); @@ -901,61 +897,54 @@ read_declarations (void) switch (tok) { - case TWO_PERCENTS: + case tok_two_percents: return; - case PERCENT_LEFT_CURLY: + case tok_percent_left_curly: copy_definition (); break; - case TOKEN: + case tok_token: parse_token_decl (token_sym, nterm_sym); break; - case NTERM: + case tok_nterm: parse_token_decl (nterm_sym, token_sym); break; - case TYPE: + case tok_type: parse_type_decl (); break; - case START: + case tok_start: parse_start_decl (); break; - case UNION: + case tok_union: parse_union_decl (); break; - case EXPECT: + case tok_expect: parse_expect_decl (); break; - case THONG: + + case tok_thong: parse_thong_decl (); break; - case LEFT: + case tok_left: parse_assoc_decl (left_assoc); break; - case RIGHT: + case tok_right: parse_assoc_decl (right_assoc); break; - case NONASSOC: + case tok_nonassoc: parse_assoc_decl (non_assoc); break; - case SEMANTIC_PARSER: - semantic_parser = 1; - break; - - case PURE_PARSER: - pure_parser = 1; - break; - - case NOOP: + case tok_noop: break; default: @@ -1061,7 +1050,7 @@ copy_action (symbol_list *rule, int stack_offset) } } - obstack_grow_string (&action_obstack, ";\n break;}"); + obstack_sgrow (&action_obstack, ";\n break;}"); } /*-------------------------------------------------------------------. @@ -1149,7 +1138,7 @@ copy_guard (symbol_list *rule, int stack_offset) c = skip_white_space (); - obstack_grow_string (&guard_obstack, ";\n break;}"); + obstack_sgrow (&guard_obstack, ";\n break;}"); if (c == '{') copy_action (rule, stack_offset); else if (c == '=') @@ -1185,9 +1174,14 @@ record_rule_line (void) static bucket * gensym (void) { + /* Incremented for each generated symbol */ + static int gensym_count = 0; + static char buf[256]; + bucket *sym; - sprintf (token_buffer, "@%d", ++gensym_count); + sprintf (buf, "@%d", ++gensym_count); + token_buffer = buf; sym = getsym (token_buffer); sym->class = nterm_sym; sym->value = nvars++; @@ -1205,12 +1199,12 @@ static int get_type (void) { int k; - int t; + token_t token; char *name; - t = lex (); + token = lex (); - if (t != TYPENAME) + if (token != tok_typename) { complain (_("invalid %s declaration"), "%type"); return t; @@ -1220,17 +1214,17 @@ get_type (void) for (;;) { - t = lex (); + token = lex (); - switch (t) + switch (token) { - case SEMICOLON: + case tok_semicolon: return lex (); - case COMMA: + case tok_comma: break; - case IDENTIFIER: + case tok_identifier: if (symval->type_name == NULL) symval->type_name = name; else if (strcmp (name, symval->type_name) != 0) @@ -1239,7 +1233,7 @@ get_type (void) break; default: - return t; + return token; } } } @@ -1260,7 +1254,7 @@ get_type (void) static void readgram (void) { - int t; + token_t t; bucket *lhs = NULL; symbol_list *p; symbol_list *p1; @@ -1276,9 +1270,9 @@ readgram (void) t = lex (); - while (t != TWO_PERCENTS && t != ENDFILE) + while (t != tok_two_percents && t != tok_eof) { - if (t == IDENTIFIER || t == BAR) + if (t == tok_identifier || t == tok_bar) { int action_flag = 0; /* Number of symbols in rhs of this rule so far */ @@ -1286,7 +1280,7 @@ readgram (void) int xactions = 0; /* JF for error checking */ bucket *first_rhs = 0; - if (t == IDENTIFIER) + if (t == tok_identifier) { lhs = symval; @@ -1297,14 +1291,14 @@ readgram (void) } t = lex (); - if (t != COLON) + if (t != tok_colon) { complain (_("ill-formed rule: initial symbol not followed by colon")); unlex (t); } } - if (nrules == 0 && t == BAR) + if (nrules == 0 && t == tok_bar) { complain (_("grammar starts with vertical bar")); lhs = symval; /* BOGUS: use a random symval */ @@ -1344,28 +1338,28 @@ readgram (void) for (;;) { t = lex (); - if (t == PREC) + if (t == tok_prec) { t = lex (); crule->ruleprec = symval; t = lex (); } - if (!(t == IDENTIFIER || t == LEFT_CURLY)) + if (!(t == tok_identifier || t == tok_left_curly)) break; /* If next token is an identifier, see if a colon follows it. If one does, exit this rule now. */ - if (t == IDENTIFIER) + if (t == tok_identifier) { bucket *ssave; - int t1; + token_t t1; ssave = symval; t1 = lex (); unlex (t1); symval = ssave; - if (t1 == COLON) + if (t1 == tok_colon) break; if (!first_rhs) /* JF */ @@ -1415,7 +1409,7 @@ readgram (void) action_flag = 0; } - if (t == IDENTIFIER) + if (t == tok_identifier) { nitems++; p = XCALLOC (symbol_list, 1); @@ -1437,14 +1431,14 @@ readgram (void) p1->next = p; p1 = p; - if (t == PREC) + if (t == tok_prec) { complain (_("two @prec's in a row")); t = lex (); crule->ruleprec = symval; t = lex (); } - if (t == GUARD) + if (t == tok_guard) { if (!semantic_parser) complain (_("%%guard present but %%semantic_parser not specified")); @@ -1452,7 +1446,7 @@ readgram (void) copy_guard (crule, rulelength); t = lex (); } - else if (t == LEFT_CURLY) + else if (t == tok_left_curly) { /* This case never occurs -wjh */ if (action_flag) @@ -1477,7 +1471,7 @@ readgram (void) /* Warn if there is no default for $$ but we need one. */ else if (!xactions && !first_rhs && lhs->type_name != 0) complain (_("empty rule for typed nonterminal, and no action")); - if (t == SEMICOLON) + if (t == tok_semicolon) t = lex (); } #if 0 @@ -1487,31 +1481,31 @@ readgram (void) b) most of them scan forward until finding a next % thus they may swallow lots of intervening rules */ - else if (t == TOKEN) + else if (t == tok_token) { parse_token_decl (token_sym, nterm_sym); t = lex (); } - else if (t == NTERM) + else if (t == tok_nterm) { parse_token_decl (nterm_sym, token_sym); t = lex (); } - else if (t == TYPE) + else if (t == tok_type) { t = get_type (); } - else if (t == UNION) + else if (t == tok_union) { parse_union_decl (); t = lex (); } - else if (t == EXPECT) + else if (t == tok_expect) { parse_expect_decl (); t = lex (); } - else if (t == START) + else if (t == tok_start) { parse_start_decl (); t = lex (); @@ -1520,7 +1514,7 @@ readgram (void) else { - complain (_("invalid input: %s"), token_buffer); + complain (_("invalid input: %s"), quote (token_buffer)); t = lex (); } } @@ -1540,10 +1534,10 @@ readgram (void) /* We used to use `unsigned long' as YYSTYPE on MSDOS, but it seems better to be consistent. Most programs should declare their own type anyway. */ - obstack_grow_string (&attrs_obstack, + obstack_sgrow (&attrs_obstack, "#ifndef YYSTYPE\n#define YYSTYPE int\n#endif\n"); if (defines_flag) - obstack_grow_string (&defines_obstack, "\ + obstack_sgrow (&defines_obstack, "\ #ifndef YYSTYPE\n\ # define YYSTYPE int\n\ #endif\n"); @@ -1605,8 +1599,7 @@ output_token_defines (struct obstack *oout) obstack_fgrow2 (oout, "#define\t%s\t%d\n", symbol, - ((translations && !raw_flag) - ? bp->user_token_number : bp->value)); + (translations ? bp->user_token_number : bp->value)); if (semantic_parser) obstack_fgrow2 (oout, "#define\tT%s\t%d\n", symbol, bp->value); } @@ -1753,7 +1746,7 @@ packsymbols (void) obstack_fgrow1 (&defines_obstack, "\nextern YYSTYPE %slval;\n", spec_name_prefix); else - obstack_grow_string (&defines_obstack, + obstack_sgrow (&defines_obstack, "\nextern YYSTYPE yylval;\n"); } @@ -1873,8 +1866,6 @@ reader (void) typed = 0; lastprec = 0; - gensym_count = 0; - semantic_parser = 0; pure_parser = 0; @@ -1906,7 +1897,7 @@ reader (void) no_parser_flag ? "Bison-generated parse tables" : "A Bison parser", infile, VERSION); - obstack_grow_string (&table_obstack, + obstack_sgrow (&table_obstack, "#define YYBISON 1 /* Identify Bison output. */\n\n"); read_declarations (); /* Start writing the guard and action files, if they are needed. */ @@ -1921,7 +1912,7 @@ reader (void) /* Write closing delimiters for actions and guards. */ output_trailers (); if (locations_flag) - obstack_grow_string (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); + obstack_sgrow (&table_obstack, "#define YYLSP_NEEDED 1\n\n"); /* Assign the symbols their symbol numbers. Write #defines for the token symbols into FDEFINES if requested. */ packsymbols (); @@ -1942,7 +1933,7 @@ void reader_output_yylsp (struct obstack *oout) { if (locations_flag) - obstack_grow_string (oout, "\ + obstack_sgrow (oout, "\ \n\ #ifndef YYLTYPE\n\ typedef struct yyltype\n\