X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/27821bff0ff9f96e2e12036a16aee8481ef400d7..0d533154e4618606f7a0907b68fedafb35982924:/src/reader.c?ds=sidebyside diff --git a/src/reader.c b/src/reader.c index f0c0434c..0d5e71fb 100644 --- a/src/reader.c +++ b/src/reader.c @@ -60,7 +60,7 @@ typedef\n\ \n" /* Number of slots allocated (but not necessarily used yet) in `rline' */ -int rline_allocated; +static int rline_allocated; extern int definesflag; extern int nolinesflag; @@ -96,38 +96,38 @@ typedef symbol_list; -void reader PARAMS((void)); -void reader_output_yylsp PARAMS((FILE *)); -void read_declarations PARAMS((void)); -void copy_definition PARAMS((void)); -void parse_token_decl PARAMS((int, int)); -void parse_start_decl PARAMS((void)); -void parse_type_decl PARAMS((void)); -void parse_assoc_decl PARAMS((int)); -void parse_union_decl PARAMS((void)); -void parse_expect_decl PARAMS((void)); -char *get_type_name PARAMS((int, symbol_list *)); -void copy_guard PARAMS((symbol_list *, int)); -void parse_thong_decl PARAMS((void)); -void copy_action PARAMS((symbol_list *, int)); -bucket *gensym PARAMS((void)); -void readgram PARAMS((void)); -void record_rule_line PARAMS((void)); -void packsymbols PARAMS((void)); -void output_token_defines PARAMS((FILE *)); -void packgram PARAMS((void)); -int read_signed_integer PARAMS((FILE *)); +extern void reader PARAMS((void)); +extern void reader_output_yylsp PARAMS((FILE *)); + +static void read_declarations PARAMS((void)); +static void copy_definition PARAMS((void)); +static void parse_token_decl PARAMS((int, int)); +static void parse_start_decl PARAMS((void)); +static void parse_type_decl PARAMS((void)); +static void parse_assoc_decl PARAMS((int)); +static void parse_union_decl PARAMS((void)); +static void parse_expect_decl PARAMS((void)); +static char *get_type_name PARAMS((int, symbol_list *)); +static void copy_guard PARAMS((symbol_list *, int)); +static void parse_thong_decl PARAMS((void)); +static void copy_action PARAMS((symbol_list *, int)); +static bucket *gensym PARAMS((void)); +static void readgram PARAMS((void)); +static void record_rule_line PARAMS((void)); +static void packsymbols PARAMS((void)); +static void output_token_defines PARAMS((FILE *)); +static void packgram PARAMS((void)); #if 0 static int get_type PARAMS((void)); #endif int lineno; -symbol_list *grammar; -int start_flag; -bucket *startval; char **tags; int *user_toknums; +static symbol_list *grammar; +static int start_flag; +static bucket *startval; /* Nonzero if components of semantic values are used, implying they must be unions. */ @@ -145,6 +145,10 @@ static bucket *undeftoken; /* Nonzero if any action or guard uses the @n construct. */ static int yylsp_needed; + +/*===================\ +| Low level lexing. | +\===================*/ static void skip_to_char (int target) @@ -156,23 +160,53 @@ skip_to_char (int target) complain (_(" Skipping to next %c"), target); do - c = skip_white_space(); + c = skip_white_space (); while (c != target && c != EOF); if (c != EOF) - ungetc(c, finput); + ungetc (c, finput); } -/* Dump the string from FINPUT to FOUTPUT. MATCH is the delimiter of - the string (either ' or "). */ +/*---------------------------------------------------------. +| Read a signed integer from STREAM and return its value. | +`---------------------------------------------------------*/ + +static inline int +read_signed_integer (FILE *stream) +{ + register int c = getc (stream); + register int sign = 1; + register int n = 0; + + if (c == '-') + { + c = getc (stream); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = getc (stream); + } + + ungetc (c, stream); + + return sign * n; +} + +/*-------------------------------------------------------------------. +| Dump the string from FINPUT to FOUTPUT. MATCH is the delimiter of | +| the string (either ' or "). | +`-------------------------------------------------------------------*/ static inline void -copy_string (FILE *finput, FILE *foutput, int match) +copy_string (FILE *fin, FILE *fout, int match) { int c; - putc (match, foutput); - c = getc (finput); + putc (match, fout); + c = getc (fin); while (c != match) { @@ -181,27 +215,27 @@ copy_string (FILE *finput, FILE *foutput, int match) if (c == '\n') { complain (_("unterminated string")); - ungetc (c, finput); + ungetc (c, fin); c = match; /* invent terminator */ continue; } - putc(c, foutput); + putc(c, fout); if (c == '\\') { - c = getc (finput); + c = getc (fin); if (c == EOF) fatal (_("unterminated string at end of file")); - putc (c, foutput); + putc (c, fout); if (c == '\n') lineno++; } - c = getc(finput); + c = getc(fin); } - putc(c, foutput); + putc(c, fout); } @@ -265,13 +299,13 @@ copy_comment2 (FILE *in, FILE *out1, FILE* out2, int c) } -/* Dump the comment from FINPUT to FOUTPUT. C is either `*' or `/', +/* Dump the comment from FIN to FOUT. C is either `*' or `/', depending upon the type of comments used. */ static inline void -copy_comment (FILE *finput, FILE *foutput, int c) +copy_comment (FILE *fin, FILE *fout, int c) { - copy_comment2 (finput, foutput, NULL, c); + copy_comment2 (fin, fout, NULL, c); } @@ -282,11 +316,12 @@ reader (void) startval = NULL; /* start symbol not specified yet. */ #if 0 - translations = 0; /* initially assume token number translation not needed. */ + /* initially assume token number translation not needed. */ + translations = 0; #endif - /* Nowadays translations is always set to 1, - since we give `error' a user-token-number - to satisfy the Posix demand for YYERRCODE==256. */ + /* Nowadays translations is always set to 1, since we give `error' a + user-token-number to satisfy the Posix demand for YYERRCODE==256. + */ translations = 1; nsyms = 1; @@ -294,7 +329,7 @@ reader (void) nrules = 0; nitems = 0; rline_allocated = 10; - rline = NEW2(rline_allocated, short); + rline = NEW2 (rline_allocated, short); typed = 0; lastprec = 0; @@ -307,50 +342,56 @@ reader (void) grammar = NULL; - init_lex(); + init_lex (); lineno = 1; - /* initialize the symbol table. */ - tabinit(); - /* construct the error token */ - errtoken = getsym("error"); + /* Initialize the symbol table. */ + tabinit (); + /* Construct the error token */ + errtoken = getsym ("error"); errtoken->class = STOKEN; - errtoken->user_token_number = 256; /* Value specified by posix. */ - /* construct a token that represents all undefined literal tokens. */ - /* it is always token number 2. */ - undeftoken = getsym("$undefined."); + errtoken->user_token_number = 256; /* Value specified by POSIX. */ + /* Construct a token that represents all undefined literal tokens. + It is always token number 2. */ + undeftoken = getsym ("$undefined."); undeftoken->class = STOKEN; undeftoken->user_token_number = 2; - /* Read the declaration section. Copy %{ ... %} groups to ftable and fdefines file. - Also notice any %token, %left, etc. found there. */ - if (noparserflag) - fprintf(ftable, "\n/* Bison-generated parse tables, made from %s\n", - infile); - else - fprintf(ftable, "\n/* A Bison parser, made from %s\n", infile); - fprintf(ftable, " by %s */\n\n", VERSION_STRING); - fprintf(ftable, "#define YYBISON 1 /* Identify Bison output. */\n\n"); - read_declarations(); - /* start writing the guard and action files, if they are needed. */ - output_headers(); - /* read in the grammar, build grammar in list form. write out guards and actions. */ - readgram(); - /* Now we know whether we need the line-number stack. - If we do, write its type into the .tab.h file. */ + + /* Read the declaration section. Copy %{ ... %} groups to FTABLE + and FDEFINES file. Also notice any %token, %left, etc. found + there. */ + putc ('\n', ftable); + fprintf (ftable, "\ +/* %s, made from %s\n\ + by GNU bison %s. */\n\ +\n", + noparserflag ? "Bison-generated parse tables" : "A Bison parser", + infile, + VERSION); + + fputs ("#define YYBISON 1 /* Identify Bison output. */\n\n", ftable); + read_declarations (); + /* Start writing the guard and action files, if they are needed. */ + output_headers (); + /* Read in the grammar, build grammar in list form. Write out + guards and actions. */ + readgram (); + /* Now we know whether we need the line-number stack. If we do, + write its type into the .tab.h file. */ if (fdefines) - reader_output_yylsp(fdefines); - /* write closing delimiters for actions and guards. */ - output_trailers(); + reader_output_yylsp (fdefines); + /* Write closing delimiters for actions and guards. */ + output_trailers (); if (yylsp_needed) - fprintf(ftable, "#define YYLSP_NEEDED\n\n"); - /* assign the symbols their symbol numbers. - Write #defines for the token symbols into fdefines if requested. */ - packsymbols(); - /* convert the grammar into the format described in gram.h. */ - packgram(); - /* free the symbol table data structure - since symbols are now all referred to by symbol number. */ - free_symtab(); + fputs ("#define YYLSP_NEEDED\n\n", ftable); + /* Assign the symbols their symbol numbers. Write #defines for the + token symbols into FDEFINES if requested. */ + packsymbols (); + /* Convert the grammar into the format described in gram.h. */ + packgram (); + /* Free the symbol table data structure since symbols are now all + referred to by symbol number. */ + free_symtab (); } void @@ -364,7 +405,7 @@ reader_output_yylsp (FILE *f) `%' declarations, and copy the contents of any `%{ ... %}' groups to fattrs. */ -void +static void read_declarations (void) { register int c; @@ -459,7 +500,7 @@ read_declarations (void) /* Copy the contents of a `%{ ... %}' into the definitions file. The `%{' has already been read. Return after reading the `%}'. */ -void +static void copy_definition (void) { register int c; @@ -527,7 +568,7 @@ copy_definition (void) For %token, what_is is STOKEN and what_is_not is SNTERM. For %nterm, the arguments are reversed. */ -void +static void parse_token_decl (int what_is, int what_is_not) { register int token = 0; @@ -625,7 +666,7 @@ parse_token_decl (int what_is, int what_is_not) it is the literal string that is output to yytname */ -void +static void parse_thong_decl (void) { register int token; @@ -687,7 +728,7 @@ parse_thong_decl (void) /* Parse what comes after %start */ -void +static void parse_start_decl (void) { if (start_flag) @@ -705,7 +746,7 @@ parse_start_decl (void) /* read in a %type declaration and record its information for get_type_name to access */ -void +static void parse_type_decl (void) { register int k; @@ -762,7 +803,7 @@ parse_type_decl (void) /* read in a %left, %right or %nonassoc declaration and record its information. */ /* assoc is either LEFT_ASSOC, RIGHT_ASSOC or NON_ASSOC. */ -void +static void parse_assoc_decl (int assoc) { register int k; @@ -845,7 +886,7 @@ parse_assoc_decl (int assoc) where it is made into the definition of YYSTYPE, the type of elements of the parser value stack. */ -void +static void parse_union_decl (void) { register int c; @@ -915,7 +956,7 @@ parse_union_decl (void) /* parse the declaration %expect N which says to expect N shift-reduce conflicts. */ -void +static void parse_expect_decl (void) { register int c; @@ -944,29 +985,29 @@ parse_expect_decl (void) /* that's all of parsing the declaration section */ -/* FINPUT is pointing to a location (i.e., a `@'). Output to FOUTPUT +/* FIN is pointing to a location (i.e., a `@'). Output to FOUT a reference to this location. STACK_OFFSET is the number of values in the current rule so far, which says where to find `$0' with respect to the top of the stack. */ static inline void -copy_at (FILE *finput, FILE *foutput, int stack_offset) +copy_at (FILE *fin, FILE *fout, int stack_offset) { int c; - c = getc (finput); + c = getc (fin); if (c == '$') { - fprintf (foutput, "yyloc"); + fprintf (fout, "yyloc"); yylsp_needed = 1; } else if (isdigit(c) || c == '-') { int n; - ungetc (c, finput); - n = read_signed_integer (finput); + ungetc (c, fin); + n = read_signed_integer (fin); - fprintf (foutput, "yylsp[%d]", n - stack_offset); + fprintf (fout, "yylsp[%d]", n - stack_offset); yylsp_needed = 1; } else @@ -977,7 +1018,7 @@ copy_at (FILE *finput, FILE *foutput, int stack_offset) /* Get the data type (alternative in the union) of the value for symbol n in rule rule. */ -char * +static char * get_type_name (int n, symbol_list *rule) { register int i; @@ -1015,7 +1056,7 @@ get_type_name (int n, symbol_list *rule) respect to the top of the stack, for the simple parser in which the stack is not popped until after the guard is run. */ -void +static void copy_guard (symbol_list *rule, int stack_offset) { register int c; @@ -1165,7 +1206,7 @@ copy_guard (symbol_list *rule, int stack_offset) values in the current rule so far, which says where to find `$0' with respect to the top of the stack. */ -void +static void copy_action (symbol_list *rule, int stack_offset) { register int c; @@ -1299,7 +1340,7 @@ copy_action (symbol_list *rule, int stack_offset) /* generate a dummy symbol, a nonterminal, whose name cannot conflict with the user's names. */ -bucket * +static bucket * gensym (void) { register bucket *sym; @@ -1320,7 +1361,7 @@ The next symbol is the lhs of the following rule. All guards and actions are copied out to the appropriate files, labelled by the rule number they apply to. */ -void +static void readgram (void) { register int t; @@ -1617,7 +1658,7 @@ readgram (void) } -void +static void record_rule_line (void) { /* Record each rule's source line number in rline table. */ @@ -1686,18 +1727,19 @@ get_type (void) fdefines. Set up vectors tags and sprec of names and precedences of symbols. */ -void +static void packsymbols (void) { register bucket *bp; register int tokno = 1; register int i; register int last_user_token_number; + static char DOLLAR[] = "$"; /* int lossage = 0; JF set but not used */ tags = NEW2(nsyms + 1, char *); - tags[0] = "$"; + tags[0] = DOLLAR; user_toknums = NEW2(nsyms + 1, int); user_toknums[0] = 0; @@ -1771,15 +1813,15 @@ packsymbols (void) if (translations) { - register int i; + register int j; token_translations = NEW2(max_user_token_number+1, short); /* initialize all entries for literal tokens to 2, the internal token number for $undefined., which represents all invalid inputs. */ - for (i = 0; i <= max_user_token_number; i++) - token_translations[i] = 2; + for (j = 0; j <= max_user_token_number; j++) + token_translations[j] = 2; for (bp = firstsymbol; bp; bp = bp->next) { @@ -1839,7 +1881,7 @@ packsymbols (void) /* For named tokens, but not literal ones, define the name. The value is the user token number. */ -void +static void output_token_defines (FILE *file) { bucket *bp; @@ -1883,7 +1925,7 @@ output_token_defines (FILE *file) /* convert the rules into the representation using rrhs, rlhs and ritems. */ -void +static void packgram (void) { register int itemno; @@ -1941,29 +1983,3 @@ packgram (void) ritem[itemno] = 0; } - -/* Read a signed integer from STREAM and return its value. */ - -int -read_signed_integer (FILE *stream) -{ - register int c = getc(stream); - register int sign = 1; - register int n; - - if (c == '-') - { - c = getc(stream); - sign = -1; - } - n = 0; - while (isdigit(c)) - { - n = 10*n + (c - '0'); - c = getc(stream); - } - - ungetc(c, stream); - - return n * sign; -}