Improve the readability of the produced parsers.

* src/bison.s1: Formatting changes.
Improve the comment related to the `$' mark.
(yydefault): Don't fall through to `yyresume': `goto' there.
* src/output.c (output_parser): When the `$' is met, skip the end
of its line.
New variable, `number_of_dollar_signs', to check there's exactly
one `$' in the parser skeleton.
This commit is contained in:
Akim Demaille
2000-10-02 09:03:20 +00:00
parent 95e36146a5
commit 71da9eeacc
4 changed files with 247 additions and 127 deletions

View File

@@ -1,3 +1,16 @@
2000-10-02 Akim Demaille <akim@epita.fr>
Improve the readability of the produced parsers.
* src/bison.s1: Formatting changes.
Improve the comment related to the `$' mark.
(yydefault): Don't fall through to `yyresume': `goto' there.
* src/output.c (output_parser): When the `$' is met, skip the end
of its line.
New variable, `number_of_dollar_signs', to check there's exactly
one `$' in the parser skeleton.
2000-10-02 Akim Demaille <akim@epita.fr> 2000-10-02 Akim Demaille <akim@epita.fr>
* lib/xstrdup.c: New file, from the fileutils. * lib/xstrdup.c: New file, from the fileutils.

View File

@@ -25,10 +25,10 @@
This special exception was added by the Free Software Foundation This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */ in version 1.24 of Bison. */
/* This is the parser code that is written into each bison parser /* This is the parser code that is written into each bison parser when
when the %semantic_parser declaration is not specified in the grammar. the %semantic_parser declaration is not specified in the grammar.
It was written by Richard Stallman by simplifying the hairy parser It was written by Richard Stallman by simplifying the hairy parser
used when %semantic_parser is specified. */ used when %semantic_parser is specified. */
#ifndef YYSTACK_USE_ALLOCA #ifndef YYSTACK_USE_ALLOCA
# ifdef alloca # ifdef alloca
@@ -91,55 +91,59 @@
#define YYACCEPT goto yyacceptlab #define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab #define YYABORT goto yyabortlab
#define YYERROR goto yyerrlab1 #define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror. /* Like YYERROR except do call yyerror. This remains here temporarily
This remains here temporarily to ease the to ease the transition to the new meaning of YYERROR, for GCC.
transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */ Once GCC version 2 has supplanted version 1, this can go. */
#define YYFAIL goto yyerrlab #define YYFAIL goto yyerrlab
#define YYRECOVERING() (!!yyerrstatus) #define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(token, value) \ #define YYBACKUP(Token, Value) \
do \ do \
if (yychar == YYEMPTY && yylen == 1) \ if (yychar == YYEMPTY && yylen == 1) \
{ yychar = (token), yylval = (value); \ { \
yychar = (Token); \
yylval = (Value); \
yychar1 = YYTRANSLATE (yychar); \ yychar1 = YYTRANSLATE (yychar); \
YYPOPSTACK; \ YYPOPSTACK; \
goto yybackup; \ goto yybackup; \
} \ } \
else \ else \
{ yyerror ("syntax error: cannot back up"); YYERROR; } \ { \
yyerror ("syntax error: cannot back up"); \
YYERROR; \
} \
while (0) while (0)
#define YYTERROR 1 #define YYTERROR 1
#define YYERRCODE 256 #define YYERRCODE 256
#ifndef YYPURE #ifndef YYPURE
# define YYLEX yylex() # define YYLEX yylex ()
#endif #endif
#ifdef YYPURE #ifdef YYPURE
# ifdef YYLSP_NEEDED # ifdef YYLSP_NEEDED
# ifdef YYLEX_PARAM # ifdef YYLEX_PARAM
# define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
# else # else
# define YYLEX yylex(&yylval, &yylloc) # define YYLEX yylex (&yylval, &yylloc)
# endif # endif
# else /* not YYLSP_NEEDED */ # else /* !YYLSP_NEEDED */
# ifdef YYLEX_PARAM # ifdef YYLEX_PARAM
# define YYLEX yylex(&yylval, YYLEX_PARAM) # define YYLEX yylex (&yylval, YYLEX_PARAM)
# else # else
# define YYLEX yylex(&yylval) # define YYLEX yylex (&yylval)
# endif # endif
# endif /* not YYLSP_NEEDED */ # endif /* !YYLSP_NEEDED */
#endif #endif
/* If nonreentrant, generate the variables here. */ /* If nonreentrant, generate the variables here. */
#ifndef YYPURE #ifndef YYPURE
/* The lookahead symbol. */ /* The lookahead symbol. */
int yychar; int yychar;
/* The semantic value of the lookahead symbol. */ /* The semantic value of the lookahead symbol. */
YYSTYPE yylval; YYSTYPE yylval;
# ifdef YYLSP_NEEDED # ifdef YYLSP_NEEDED
/* Location data for the lookahead symbol. */ /* Location data for the lookahead symbol. */
@@ -148,7 +152,7 @@ YYLTYPE yylloc;
/* Number of parse errors so far. */ /* Number of parse errors so far. */
int yynerrs; int yynerrs;
#endif /* not YYPURE */ #endif /* !YYPURE */
#if YYDEBUG #if YYDEBUG
@@ -186,7 +190,7 @@ int yydebug; /* nonzero means print parse trace */
of type size_t, but it can handle unsigned int. */ of type size_t, but it can handle unsigned int. */
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
# define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) # define __yy_memcpy(To,From,Count) __builtin_memcpy (To,From,Count)
#else /* not GNU C or C++ */ #else /* not GNU C or C++ */
# ifndef __cplusplus # ifndef __cplusplus
@@ -236,14 +240,14 @@ __yy_memcpy (char *to, char *from, unsigned int count)
# ifdef __cplusplus # ifdef __cplusplus
# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM # define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
# define YYPARSE_PARAM_DECL # define YYPARSE_PARAM_DECL
# else /* not __cplusplus */ # else /* !__cplusplus */
# define YYPARSE_PARAM_ARG YYPARSE_PARAM # define YYPARSE_PARAM_ARG YYPARSE_PARAM
# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; # define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif /* not __cplusplus */ # endif /* !__cplusplus */
#else /* not YYPARSE_PARAM */ #else /* !YYPARSE_PARAM */
# define YYPARSE_PARAM_ARG # define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL # define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */ #endif /* !YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */ /* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__ #ifdef __GNUC__
@@ -255,7 +259,7 @@ int yyparse (void);
#endif #endif
int int
yyparse(YYPARSE_PARAM_ARG) yyparse (YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL YYPARSE_PARAM_DECL
{ {
register int yystate; register int yystate;
@@ -339,17 +343,21 @@ yyparse(YYPARSE_PARAM_ARG)
yylsp = yyls; yylsp = yyls;
#endif #endif
/* Push a new state, which is found in yystate . */
/* In all cases, when you get here, the value and location stacks
have just been pushed. so pushing a state here evens the stacks. */
yynewstate:
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |
`------------------------------------------------------------*/
yynewstate:
/* In all cases, when you get here, the value and location stacks
have just been pushed. so pushing a state here evens the stacks.
*/
*++yyssp = yystate; *++yyssp = yystate;
if (yyssp >= yyss + yystacksize - 1) if (yyssp >= yyss + yystacksize - 1)
{ {
/* Give user a chance to reallocate the stack */ /* Give user a chance to reallocate the stack. Use copies of
/* Use copies of these so that the &'s don't force the real ones into memory. */ these so that the &'s don't force the real ones into memory.
*/
YYSTYPE *yyvs1 = yyvs; YYSTYPE *yyvs1 = yyvs;
short *yyss1 = yyss; short *yyss1 = yyss;
#ifdef YYLSP_NEEDED #ifdef YYLSP_NEEDED
@@ -385,7 +393,7 @@ yynewstate:
/* Extend the stack our own way. */ /* Extend the stack our own way. */
if (yystacksize >= YYMAXDEPTH) if (yystacksize >= YYMAXDEPTH)
{ {
yyerror("parser stack overflow"); yyerror ("parser stack overflow");
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);
@@ -432,7 +440,12 @@ yynewstate:
fprintf (stderr, "Entering state %d\n", yystate); fprintf (stderr, "Entering state %d\n", yystate);
goto yybackup; goto yybackup;
yybackup:
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. */ /* Do appropriate processing given the current state. */
/* Read a lookahead token if we need one and don't already have one. */ /* Read a lookahead token if we need one and don't already have one. */
@@ -468,7 +481,7 @@ yynewstate:
} }
else else
{ {
yychar1 = YYTRANSLATE(yychar); yychar1 = YYTRANSLATE (yychar);
#if YYDEBUG #if YYDEBUG
/* We have to keep this `#if YYDEBUG', since we use variables /* We have to keep this `#if YYDEBUG', since we use variables
@@ -527,21 +540,30 @@ yynewstate:
*++yylsp = yylloc; *++yylsp = yylloc;
#endif #endif
/* count tokens shifted since error; after three, turn off error status. */ /* Count tokens shifted since error; after three, turn off error
if (yyerrstatus) yyerrstatus--; status. */
if (yyerrstatus)
yyerrstatus--;
yystate = yyn; yystate = yyn;
goto yynewstate; goto yynewstate;
/* Do the default action for the current state. */
yydefault:
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate]; yyn = yydefact[yystate];
if (yyn == 0) if (yyn == 0)
goto yyerrlab; goto yyerrlab;
goto yyreduce;
/* Do a reduction. yyn is the number of a rule to reduce with. */
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
yyreduce: yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn]; yylen = yyr2[yyn];
/* Implement default value of the action: /* Implement default value of the action:
`{dollar}{dollar} = {dollar}1'. */ `{dollar}{dollar} = {dollar}1'. */
@@ -581,7 +603,7 @@ yyreduce:
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
} }
#endif #endif
$ /* the action file gets copied in in place of this dollarsign */ $ /* The action file replaces this line marked with this dollarsign. */
#line #line
yyvsp -= yylen; yyvsp -= yylen;
@@ -618,10 +640,13 @@ $ /* the action file gets copied in in place of this dollarsign */
goto yynewstate; goto yynewstate;
yyerrlab: /* here on detecting error */
if (! yyerrstatus) /*------------------------------------.
/* If not already recovering from an error, report this error. */ | yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{ {
++yynerrs; ++yynerrs;
@@ -637,9 +662,9 @@ yyerrlab: /* here on detecting error */
count = 0; count = 0;
/* Start X at -yyn if nec to avoid negative indexes in yycheck. */ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
for (x = (yyn < 0 ? -yyn : 0); for (x = (yyn < 0 ? -yyn : 0);
x < (sizeof(yytname) / sizeof(char *)); x++) x < (sizeof (yytname) / sizeof (char *)); x++)
if (yycheck[x + yyn] == x) if (yycheck[x + yyn] == x)
size += strlen(yytname[x]) + 15, count++; size += strlen (yytname[x]) + 15, count++;
size += strlen ("parse error, unexpected `") + 1; size += strlen ("parse error, unexpected `") + 1;
size += strlen (yytname[YYTRANSLATE (yychar)]); size += strlen (yytname[YYTRANSLATE (yychar)]);
msg = (char *) malloc (size); msg = (char *) malloc (size);
@@ -653,7 +678,7 @@ yyerrlab: /* here on detecting error */
{ {
count = 0; count = 0;
for (x = (yyn < 0 ? -yyn : 0); for (x = (yyn < 0 ? -yyn : 0);
x < (sizeof(yytname) / sizeof(char *)); x++) x < (sizeof (yytname) / sizeof (char *)); x++)
if (yycheck[x + yyn] == x) if (yycheck[x + yyn] == x)
{ {
strcat (msg, count == 0 ? ", expecting `" : " or `"); strcat (msg, count == 0 ? ", expecting `" : " or `");
@@ -672,13 +697,17 @@ yyerrlab: /* here on detecting error */
#endif /* YYERROR_VERBOSE */ #endif /* YYERROR_VERBOSE */
yyerror ("parse error"); yyerror ("parse error");
} }
goto yyerrlab1; goto yyerrlab1;
yyerrlab1: /* here on error raised explicitly by an action */
/*--------------------------------------------------.
| yyerrlab1 -- error raised explicitly by an action |
`--------------------------------------------------*/
yyerrlab1:
if (yyerrstatus == 3) if (yyerrstatus == 3)
{ {
/* if just tried and failed to reuse lookahead token after an error, discard it. */ /* If just tried and failed to reuse lookahead token after an
error, discard it. */
/* return failure if at end of input */ /* return failure if at end of input */
if (yychar == YYEOF) if (yychar == YYEOF)
@@ -691,25 +720,37 @@ yyerrlab1: /* here on error raised explicitly by an action */
yychar = YYEMPTY; yychar = YYEMPTY;
} }
/* Else will try to reuse lookahead token /* Else will try to reuse lookahead token after shifting the error
after shifting the error token. */ token. */
yyerrstatus = 3; /* Each real token shifted decrements this */ yyerrstatus = 3; /* Each real token shifted decrements this */
goto yyerrhandle; goto yyerrhandle;
yyerrdefault: /* current state does not do anything special for the error token. */
/*-------------------------------------------------------------------.
| yyerrdefault -- current state does not do anything special for the |
| error token. |
`-------------------------------------------------------------------*/
yyerrdefault:
#if 0 #if 0
/* This is wrong; only states that explicitly want error tokens /* This is wrong; only states that explicitly want error tokens
should shift them. */ should shift them. */
yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
if (yyn) goto yydefault; /* If its default is to accept any token, ok. Otherwise pop it. */
yyn = yydefact[yystate];
if (yyn)
goto yydefault;
#endif #endif
yyerrpop: /* pop the current state because it cannot handle the error token */
if (yyssp == yyss) YYABORT; /*---------------------------------------------------------------.
| yyerrpop -- pop the current state because it cannot handle the |
| error token |
`---------------------------------------------------------------*/
yyerrpop:
if (yyssp == yyss)
YYABORT;
yyvsp--; yyvsp--;
yystate = *--yyssp; yystate = *--yyssp;
#ifdef YYLSP_NEEDED #ifdef YYLSP_NEEDED
@@ -725,8 +766,11 @@ yyerrpop: /* pop the current state because it cannot handle the error token */
fprintf (stderr, "\n"); fprintf (stderr, "\n");
} }
yyerrhandle:
/*--------------.
| yyerrhandle. |
`--------------*/
yyerrhandle:
yyn = yypact[yystate]; yyn = yypact[yystate];
if (yyn == YYFLAG) if (yyn == YYFLAG)
goto yyerrdefault; goto yyerrdefault;
@@ -760,8 +804,11 @@ yyerrhandle:
yystate = yyn; yystate = yyn;
goto yynewstate; goto yynewstate;
yyacceptlab:
/* YYACCEPT comes here. */ /*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);
@@ -772,8 +819,11 @@ yyerrhandle:
} }
return 0; return 0;
yyabortlab:
/* YYABORT comes here. */ /*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);

View File

@@ -25,10 +25,10 @@
This special exception was added by the Free Software Foundation This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */ in version 1.24 of Bison. */
/* This is the parser code that is written into each bison parser /* This is the parser code that is written into each bison parser when
when the %semantic_parser declaration is not specified in the grammar. the %semantic_parser declaration is not specified in the grammar.
It was written by Richard Stallman by simplifying the hairy parser It was written by Richard Stallman by simplifying the hairy parser
used when %semantic_parser is specified. */ used when %semantic_parser is specified. */
#ifndef YYSTACK_USE_ALLOCA #ifndef YYSTACK_USE_ALLOCA
# ifdef alloca # ifdef alloca
@@ -91,55 +91,59 @@
#define YYACCEPT goto yyacceptlab #define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab #define YYABORT goto yyabortlab
#define YYERROR goto yyerrlab1 #define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror. /* Like YYERROR except do call yyerror. This remains here temporarily
This remains here temporarily to ease the to ease the transition to the new meaning of YYERROR, for GCC.
transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */ Once GCC version 2 has supplanted version 1, this can go. */
#define YYFAIL goto yyerrlab #define YYFAIL goto yyerrlab
#define YYRECOVERING() (!!yyerrstatus) #define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(token, value) \ #define YYBACKUP(Token, Value) \
do \ do \
if (yychar == YYEMPTY && yylen == 1) \ if (yychar == YYEMPTY && yylen == 1) \
{ yychar = (token), yylval = (value); \ { \
yychar = (Token); \
yylval = (Value); \
yychar1 = YYTRANSLATE (yychar); \ yychar1 = YYTRANSLATE (yychar); \
YYPOPSTACK; \ YYPOPSTACK; \
goto yybackup; \ goto yybackup; \
} \ } \
else \ else \
{ yyerror ("syntax error: cannot back up"); YYERROR; } \ { \
yyerror ("syntax error: cannot back up"); \
YYERROR; \
} \
while (0) while (0)
#define YYTERROR 1 #define YYTERROR 1
#define YYERRCODE 256 #define YYERRCODE 256
#ifndef YYPURE #ifndef YYPURE
# define YYLEX yylex() # define YYLEX yylex ()
#endif #endif
#ifdef YYPURE #ifdef YYPURE
# ifdef YYLSP_NEEDED # ifdef YYLSP_NEEDED
# ifdef YYLEX_PARAM # ifdef YYLEX_PARAM
# define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
# else # else
# define YYLEX yylex(&yylval, &yylloc) # define YYLEX yylex (&yylval, &yylloc)
# endif # endif
# else /* not YYLSP_NEEDED */ # else /* !YYLSP_NEEDED */
# ifdef YYLEX_PARAM # ifdef YYLEX_PARAM
# define YYLEX yylex(&yylval, YYLEX_PARAM) # define YYLEX yylex (&yylval, YYLEX_PARAM)
# else # else
# define YYLEX yylex(&yylval) # define YYLEX yylex (&yylval)
# endif # endif
# endif /* not YYLSP_NEEDED */ # endif /* !YYLSP_NEEDED */
#endif #endif
/* If nonreentrant, generate the variables here. */ /* If nonreentrant, generate the variables here. */
#ifndef YYPURE #ifndef YYPURE
/* The lookahead symbol. */ /* The lookahead symbol. */
int yychar; int yychar;
/* The semantic value of the lookahead symbol. */ /* The semantic value of the lookahead symbol. */
YYSTYPE yylval; YYSTYPE yylval;
# ifdef YYLSP_NEEDED # ifdef YYLSP_NEEDED
/* Location data for the lookahead symbol. */ /* Location data for the lookahead symbol. */
@@ -148,7 +152,7 @@ YYLTYPE yylloc;
/* Number of parse errors so far. */ /* Number of parse errors so far. */
int yynerrs; int yynerrs;
#endif /* not YYPURE */ #endif /* !YYPURE */
#if YYDEBUG #if YYDEBUG
@@ -186,7 +190,7 @@ int yydebug; /* nonzero means print parse trace */
of type size_t, but it can handle unsigned int. */ of type size_t, but it can handle unsigned int. */
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
# define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) # define __yy_memcpy(To,From,Count) __builtin_memcpy (To,From,Count)
#else /* not GNU C or C++ */ #else /* not GNU C or C++ */
# ifndef __cplusplus # ifndef __cplusplus
@@ -236,14 +240,14 @@ __yy_memcpy (char *to, char *from, unsigned int count)
# ifdef __cplusplus # ifdef __cplusplus
# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM # define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
# define YYPARSE_PARAM_DECL # define YYPARSE_PARAM_DECL
# else /* not __cplusplus */ # else /* !__cplusplus */
# define YYPARSE_PARAM_ARG YYPARSE_PARAM # define YYPARSE_PARAM_ARG YYPARSE_PARAM
# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; # define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif /* not __cplusplus */ # endif /* !__cplusplus */
#else /* not YYPARSE_PARAM */ #else /* !YYPARSE_PARAM */
# define YYPARSE_PARAM_ARG # define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL # define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */ #endif /* !YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */ /* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__ #ifdef __GNUC__
@@ -255,7 +259,7 @@ int yyparse (void);
#endif #endif
int int
yyparse(YYPARSE_PARAM_ARG) yyparse (YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL YYPARSE_PARAM_DECL
{ {
register int yystate; register int yystate;
@@ -339,17 +343,21 @@ yyparse(YYPARSE_PARAM_ARG)
yylsp = yyls; yylsp = yyls;
#endif #endif
/* Push a new state, which is found in yystate . */
/* In all cases, when you get here, the value and location stacks
have just been pushed. so pushing a state here evens the stacks. */
yynewstate:
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |
`------------------------------------------------------------*/
yynewstate:
/* In all cases, when you get here, the value and location stacks
have just been pushed. so pushing a state here evens the stacks.
*/
*++yyssp = yystate; *++yyssp = yystate;
if (yyssp >= yyss + yystacksize - 1) if (yyssp >= yyss + yystacksize - 1)
{ {
/* Give user a chance to reallocate the stack */ /* Give user a chance to reallocate the stack. Use copies of
/* Use copies of these so that the &'s don't force the real ones into memory. */ these so that the &'s don't force the real ones into memory.
*/
YYSTYPE *yyvs1 = yyvs; YYSTYPE *yyvs1 = yyvs;
short *yyss1 = yyss; short *yyss1 = yyss;
#ifdef YYLSP_NEEDED #ifdef YYLSP_NEEDED
@@ -385,7 +393,7 @@ yynewstate:
/* Extend the stack our own way. */ /* Extend the stack our own way. */
if (yystacksize >= YYMAXDEPTH) if (yystacksize >= YYMAXDEPTH)
{ {
yyerror("parser stack overflow"); yyerror ("parser stack overflow");
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);
@@ -432,7 +440,12 @@ yynewstate:
fprintf (stderr, "Entering state %d\n", yystate); fprintf (stderr, "Entering state %d\n", yystate);
goto yybackup; goto yybackup;
yybackup:
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. */ /* Do appropriate processing given the current state. */
/* Read a lookahead token if we need one and don't already have one. */ /* Read a lookahead token if we need one and don't already have one. */
@@ -468,7 +481,7 @@ yynewstate:
} }
else else
{ {
yychar1 = YYTRANSLATE(yychar); yychar1 = YYTRANSLATE (yychar);
#if YYDEBUG #if YYDEBUG
/* We have to keep this `#if YYDEBUG', since we use variables /* We have to keep this `#if YYDEBUG', since we use variables
@@ -527,21 +540,30 @@ yynewstate:
*++yylsp = yylloc; *++yylsp = yylloc;
#endif #endif
/* count tokens shifted since error; after three, turn off error status. */ /* Count tokens shifted since error; after three, turn off error
if (yyerrstatus) yyerrstatus--; status. */
if (yyerrstatus)
yyerrstatus--;
yystate = yyn; yystate = yyn;
goto yynewstate; goto yynewstate;
/* Do the default action for the current state. */
yydefault:
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate]; yyn = yydefact[yystate];
if (yyn == 0) if (yyn == 0)
goto yyerrlab; goto yyerrlab;
goto yyreduce;
/* Do a reduction. yyn is the number of a rule to reduce with. */
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
yyreduce: yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn]; yylen = yyr2[yyn];
/* Implement default value of the action: /* Implement default value of the action:
`{dollar}{dollar} = {dollar}1'. */ `{dollar}{dollar} = {dollar}1'. */
@@ -581,7 +603,7 @@ yyreduce:
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
} }
#endif #endif
$ /* the action file gets copied in in place of this dollarsign */ $ /* The action file replaces this line marked with this dollarsign. */
#line #line
yyvsp -= yylen; yyvsp -= yylen;
@@ -618,10 +640,13 @@ $ /* the action file gets copied in in place of this dollarsign */
goto yynewstate; goto yynewstate;
yyerrlab: /* here on detecting error */
if (! yyerrstatus) /*------------------------------------.
/* If not already recovering from an error, report this error. */ | yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{ {
++yynerrs; ++yynerrs;
@@ -637,9 +662,9 @@ yyerrlab: /* here on detecting error */
count = 0; count = 0;
/* Start X at -yyn if nec to avoid negative indexes in yycheck. */ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
for (x = (yyn < 0 ? -yyn : 0); for (x = (yyn < 0 ? -yyn : 0);
x < (sizeof(yytname) / sizeof(char *)); x++) x < (sizeof (yytname) / sizeof (char *)); x++)
if (yycheck[x + yyn] == x) if (yycheck[x + yyn] == x)
size += strlen(yytname[x]) + 15, count++; size += strlen (yytname[x]) + 15, count++;
size += strlen ("parse error, unexpected `") + 1; size += strlen ("parse error, unexpected `") + 1;
size += strlen (yytname[YYTRANSLATE (yychar)]); size += strlen (yytname[YYTRANSLATE (yychar)]);
msg = (char *) malloc (size); msg = (char *) malloc (size);
@@ -653,7 +678,7 @@ yyerrlab: /* here on detecting error */
{ {
count = 0; count = 0;
for (x = (yyn < 0 ? -yyn : 0); for (x = (yyn < 0 ? -yyn : 0);
x < (sizeof(yytname) / sizeof(char *)); x++) x < (sizeof (yytname) / sizeof (char *)); x++)
if (yycheck[x + yyn] == x) if (yycheck[x + yyn] == x)
{ {
strcat (msg, count == 0 ? ", expecting `" : " or `"); strcat (msg, count == 0 ? ", expecting `" : " or `");
@@ -672,13 +697,17 @@ yyerrlab: /* here on detecting error */
#endif /* YYERROR_VERBOSE */ #endif /* YYERROR_VERBOSE */
yyerror ("parse error"); yyerror ("parse error");
} }
goto yyerrlab1; goto yyerrlab1;
yyerrlab1: /* here on error raised explicitly by an action */
/*--------------------------------------------------.
| yyerrlab1 -- error raised explicitly by an action |
`--------------------------------------------------*/
yyerrlab1:
if (yyerrstatus == 3) if (yyerrstatus == 3)
{ {
/* if just tried and failed to reuse lookahead token after an error, discard it. */ /* If just tried and failed to reuse lookahead token after an
error, discard it. */
/* return failure if at end of input */ /* return failure if at end of input */
if (yychar == YYEOF) if (yychar == YYEOF)
@@ -691,25 +720,37 @@ yyerrlab1: /* here on error raised explicitly by an action */
yychar = YYEMPTY; yychar = YYEMPTY;
} }
/* Else will try to reuse lookahead token /* Else will try to reuse lookahead token after shifting the error
after shifting the error token. */ token. */
yyerrstatus = 3; /* Each real token shifted decrements this */ yyerrstatus = 3; /* Each real token shifted decrements this */
goto yyerrhandle; goto yyerrhandle;
yyerrdefault: /* current state does not do anything special for the error token. */
/*-------------------------------------------------------------------.
| yyerrdefault -- current state does not do anything special for the |
| error token. |
`-------------------------------------------------------------------*/
yyerrdefault:
#if 0 #if 0
/* This is wrong; only states that explicitly want error tokens /* This is wrong; only states that explicitly want error tokens
should shift them. */ should shift them. */
yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
if (yyn) goto yydefault; /* If its default is to accept any token, ok. Otherwise pop it. */
yyn = yydefact[yystate];
if (yyn)
goto yydefault;
#endif #endif
yyerrpop: /* pop the current state because it cannot handle the error token */
if (yyssp == yyss) YYABORT; /*---------------------------------------------------------------.
| yyerrpop -- pop the current state because it cannot handle the |
| error token |
`---------------------------------------------------------------*/
yyerrpop:
if (yyssp == yyss)
YYABORT;
yyvsp--; yyvsp--;
yystate = *--yyssp; yystate = *--yyssp;
#ifdef YYLSP_NEEDED #ifdef YYLSP_NEEDED
@@ -725,8 +766,11 @@ yyerrpop: /* pop the current state because it cannot handle the error token */
fprintf (stderr, "\n"); fprintf (stderr, "\n");
} }
yyerrhandle:
/*--------------.
| yyerrhandle. |
`--------------*/
yyerrhandle:
yyn = yypact[yystate]; yyn = yypact[yystate];
if (yyn == YYFLAG) if (yyn == YYFLAG)
goto yyerrdefault; goto yyerrdefault;
@@ -760,8 +804,11 @@ yyerrhandle:
yystate = yyn; yystate = yyn;
goto yynewstate; goto yynewstate;
yyacceptlab:
/* YYACCEPT comes here. */ /*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);
@@ -772,8 +819,11 @@ yyerrhandle:
} }
return 0; return 0;
yyabortlab:
/* YYABORT comes here. */ /*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
if (yyfree_stacks) if (yyfree_stacks)
{ {
free (yyss); free (yyss);

View File

@@ -1166,6 +1166,7 @@ static void
output_parser (void) output_parser (void)
{ {
int c; int c;
static int number_of_dollar_signs = 0;
#ifdef DONTDEF #ifdef DONTDEF
FILE *fpars; FILE *fpars;
#else #else
@@ -1175,8 +1176,9 @@ output_parser (void)
if (pure_parser) if (pure_parser)
fprintf (ftable, "#define YYPURE 1\n\n"); fprintf (ftable, "#define YYPURE 1\n\n");
#ifdef DONTDEF /* JF no longer needed 'cuz open_extra_files changes the #ifdef DONTDEF
currently open parser from bison.simple to bison.hairy */ /* JF no longer needed 'cuz open_extra_files changes the currently
open parser from bison.simple to bison.hairy */
if (semantic_parser) if (semantic_parser)
fpars = fparser; fpars = fparser;
else else
@@ -1227,11 +1229,15 @@ output_parser (void)
{ {
if (c == '$') if (c == '$')
{ {
number_of_dollar_signs++;
assert (number_of_dollar_signs == 1);
/* `$' in the parser file indicates where to put the actions. /* `$' in the parser file indicates where to put the actions.
Copy them in at this point. */ Copy them in at this point. */
rewind (faction); rewind (faction);
for (c = getc (faction); c != EOF; c = getc (faction)) for (c = getc (faction); c != EOF; c = getc (faction))
putc (c, ftable); putc (c, ftable);
/* Skip the end of the line containing `$'. */
write_line = 0;
} }
else else
putc (c, ftable); putc (c, ftable);
@@ -1240,6 +1246,7 @@ output_parser (void)
break; break;
putc (c, ftable); putc (c, ftable);
} }
assert (number_of_dollar_signs == 1);
} }
static void static void
@@ -1294,7 +1301,7 @@ output (void)
if (debugflag) if (debugflag)
fputs ("\ fputs ("\
#ifndef YYDEBUG\n\ #ifndef YYDEBUG\n\
#define YYDEBUG 1\n\ # define YYDEBUG 1\n\
#endif\n\ #endif\n\
\n", \n",
ftable); ftable);