\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;
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. */
/* Nonzero if any action or guard uses the @n construct. */
static int yylsp_needed;
+\f
+/*===================\
+| Low level lexing. |
+\===================*/
static void
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;
+}
+\f
+/*-------------------------------------------------------------------.
+| 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)
{
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);
}
}
-/* 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);
}
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;
nrules = 0;
nitems = 0;
rline_allocated = 10;
- rline = NEW2(rline_allocated, short);
+ rline = NEW2 (rline_allocated, short);
typed = 0;
lastprec = 0;
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
`%' declarations, and copy the contents of any `%{ ... %}' groups
to fattrs. */
-void
+static void
read_declarations (void)
{
register int c;
/* 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;
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;
it is the literal string that is output to yytname
*/
-void
+static void
parse_thong_decl (void)
{
register int token;
/* Parse what comes after %start */
-void
+static void
parse_start_decl (void)
{
if (start_flag)
/* 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;
/* 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;
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;
/* parse the declaration %expect N which says to expect N
shift-reduce conflicts. */
-void
+static void
parse_expect_decl (void)
{
register int c;
/* that's all of parsing the declaration section */
\f
-/* 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
/* 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;
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;
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;
/* generate a dummy symbol, a nonterminal,
whose name cannot conflict with the user's names. */
-bucket *
+static bucket *
gensym (void)
{
register bucket *sym;
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;
}
-void
+static void
record_rule_line (void)
{
/* Record each rule's source line number in rline table. */
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;
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)
{
/* 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;
/* convert the rules into the representation using rrhs, rlhs and ritems. */
-void
+static void
packgram (void)
{
register int itemno;
ritem[itemno] = 0;
}
-\f
-/* 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;
-}