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>
* lib/xstrdup.c: New file, from the fileutils.

View File

@@ -25,8 +25,8 @@
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
/* This is the parser code that is written into each bison parser
when the %semantic_parser declaration is not specified in the grammar.
/* This is the parser code that is written into each bison parser when
the %semantic_parser declaration is not specified in the grammar.
It was written by Richard Stallman by simplifying the hairy parser
used when %semantic_parser is specified. */
@@ -91,22 +91,26 @@
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror.
This remains here temporarily to ease the
transition to the new meaning of YYERROR, for GCC.
/* Like YYERROR except do call yyerror. This remains here temporarily
to ease the transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */
#define YYFAIL goto yyerrlab
#define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(token, value) \
#define YYBACKUP(Token, Value) \
do \
if (yychar == YYEMPTY && yylen == 1) \
{ yychar = (token), yylval = (value); \
{ \
yychar = (Token); \
yylval = (Value); \
yychar1 = YYTRANSLATE (yychar); \
YYPOPSTACK; \
goto yybackup; \
} \
else \
{ yyerror ("syntax error: cannot back up"); YYERROR; } \
{ \
yyerror ("syntax error: cannot back up"); \
YYERROR; \
} \
while (0)
#define YYTERROR 1
@@ -123,13 +127,13 @@ while (0)
# else
# define YYLEX yylex (&yylval, &yylloc)
# endif
# else /* not YYLSP_NEEDED */
# else /* !YYLSP_NEEDED */
# ifdef YYLEX_PARAM
# define YYLEX yylex (&yylval, YYLEX_PARAM)
# else
# define YYLEX yylex (&yylval)
# endif
# endif /* not YYLSP_NEEDED */
# endif /* !YYLSP_NEEDED */
#endif
/* If nonreentrant, generate the variables here. */
@@ -148,7 +152,7 @@ YYLTYPE yylloc;
/* Number of parse errors so far. */
int yynerrs;
#endif /* not YYPURE */
#endif /* !YYPURE */
#if YYDEBUG
@@ -186,7 +190,7 @@ int yydebug; /* nonzero means print parse trace */
of type size_t, but it can handle unsigned int. */
#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++ */
# ifndef __cplusplus
@@ -236,14 +240,14 @@ __yy_memcpy (char *to, char *from, unsigned int count)
# ifdef __cplusplus
# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
# define YYPARSE_PARAM_DECL
# else /* not __cplusplus */
# else /* !__cplusplus */
# define YYPARSE_PARAM_ARG YYPARSE_PARAM
# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif /* not __cplusplus */
#else /* not YYPARSE_PARAM */
# endif /* !__cplusplus */
#else /* !YYPARSE_PARAM */
# define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */
#endif /* !YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__
@@ -339,17 +343,21 @@ yyparse(YYPARSE_PARAM_ARG)
yylsp = yyls;
#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;
if (yyssp >= yyss + yystacksize - 1)
{
/* Give user a chance to reallocate the stack */
/* Use copies of these so that the &'s don't force the real ones into memory. */
/* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into memory.
*/
YYSTYPE *yyvs1 = yyvs;
short *yyss1 = yyss;
#ifdef YYLSP_NEEDED
@@ -432,6 +440,11 @@ yynewstate:
fprintf (stderr, "Entering state %d\n", yystate);
goto yybackup;
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. */
@@ -527,21 +540,30 @@ yynewstate:
*++yylsp = yylloc;
#endif
/* count tokens shifted since error; after three, turn off error status. */
if (yyerrstatus) yyerrstatus--;
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
yystate = yyn;
goto yynewstate;
/* Do the default action for the current state. */
yydefault:
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
/* Do a reduction. yyn is the number of a rule to reduce with. */
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn];
/* Implement default value of the action:
`{dollar}{dollar} = {dollar}1'. */
@@ -581,7 +603,7 @@ yyreduce:
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
}
#endif
$ /* the action file gets copied in in place of this dollarsign */
$ /* The action file replaces this line marked with this dollarsign. */
#line
yyvsp -= yylen;
@@ -618,10 +640,13 @@ $ /* the action file gets copied in in place of this dollarsign */
goto yynewstate;
yyerrlab: /* here on detecting error */
if (! yyerrstatus)
/*------------------------------------.
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{
++yynerrs;
@@ -672,13 +697,17 @@ yyerrlab: /* here on detecting error */
#endif /* YYERROR_VERBOSE */
yyerror ("parse error");
}
goto yyerrlab1;
yyerrlab1: /* here on error raised explicitly by an action */
/*--------------------------------------------------.
| yyerrlab1 -- error raised explicitly by an action |
`--------------------------------------------------*/
yyerrlab1:
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 */
if (yychar == YYEOF)
@@ -691,25 +720,37 @@ yyerrlab1: /* here on error raised explicitly by an action */
yychar = YYEMPTY;
}
/* Else will try to reuse lookahead token
after shifting the error token. */
/* Else will try to reuse lookahead token after shifting the error
token. */
yyerrstatus = 3; /* Each real token shifted decrements this */
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
/* This is wrong; only states that explicitly want error tokens
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
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--;
yystate = *--yyssp;
#ifdef YYLSP_NEEDED
@@ -725,8 +766,11 @@ yyerrpop: /* pop the current state because it cannot handle the error token */
fprintf (stderr, "\n");
}
yyerrhandle:
/*--------------.
| yyerrhandle. |
`--------------*/
yyerrhandle:
yyn = yypact[yystate];
if (yyn == YYFLAG)
goto yyerrdefault;
@@ -760,8 +804,11 @@ yyerrhandle:
yystate = yyn;
goto yynewstate;
/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
/* YYACCEPT comes here. */
if (yyfree_stacks)
{
free (yyss);
@@ -772,8 +819,11 @@ yyerrhandle:
}
return 0;
/*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
/* YYABORT comes here. */
if (yyfree_stacks)
{
free (yyss);

View File

@@ -25,8 +25,8 @@
This special exception was added by the Free Software Foundation
in version 1.24 of Bison. */
/* This is the parser code that is written into each bison parser
when the %semantic_parser declaration is not specified in the grammar.
/* This is the parser code that is written into each bison parser when
the %semantic_parser declaration is not specified in the grammar.
It was written by Richard Stallman by simplifying the hairy parser
used when %semantic_parser is specified. */
@@ -91,22 +91,26 @@
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrlab1
/* Like YYERROR except do call yyerror.
This remains here temporarily to ease the
transition to the new meaning of YYERROR, for GCC.
/* Like YYERROR except do call yyerror. This remains here temporarily
to ease the transition to the new meaning of YYERROR, for GCC.
Once GCC version 2 has supplanted version 1, this can go. */
#define YYFAIL goto yyerrlab
#define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(token, value) \
#define YYBACKUP(Token, Value) \
do \
if (yychar == YYEMPTY && yylen == 1) \
{ yychar = (token), yylval = (value); \
{ \
yychar = (Token); \
yylval = (Value); \
yychar1 = YYTRANSLATE (yychar); \
YYPOPSTACK; \
goto yybackup; \
} \
else \
{ yyerror ("syntax error: cannot back up"); YYERROR; } \
{ \
yyerror ("syntax error: cannot back up"); \
YYERROR; \
} \
while (0)
#define YYTERROR 1
@@ -123,13 +127,13 @@ while (0)
# else
# define YYLEX yylex (&yylval, &yylloc)
# endif
# else /* not YYLSP_NEEDED */
# else /* !YYLSP_NEEDED */
# ifdef YYLEX_PARAM
# define YYLEX yylex (&yylval, YYLEX_PARAM)
# else
# define YYLEX yylex (&yylval)
# endif
# endif /* not YYLSP_NEEDED */
# endif /* !YYLSP_NEEDED */
#endif
/* If nonreentrant, generate the variables here. */
@@ -148,7 +152,7 @@ YYLTYPE yylloc;
/* Number of parse errors so far. */
int yynerrs;
#endif /* not YYPURE */
#endif /* !YYPURE */
#if YYDEBUG
@@ -186,7 +190,7 @@ int yydebug; /* nonzero means print parse trace */
of type size_t, but it can handle unsigned int. */
#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++ */
# ifndef __cplusplus
@@ -236,14 +240,14 @@ __yy_memcpy (char *to, char *from, unsigned int count)
# ifdef __cplusplus
# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
# define YYPARSE_PARAM_DECL
# else /* not __cplusplus */
# else /* !__cplusplus */
# define YYPARSE_PARAM_ARG YYPARSE_PARAM
# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif /* not __cplusplus */
#else /* not YYPARSE_PARAM */
# endif /* !__cplusplus */
#else /* !YYPARSE_PARAM */
# define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */
#endif /* !YYPARSE_PARAM */
/* Prevent warning if -Wstrict-prototypes. */
#ifdef __GNUC__
@@ -339,17 +343,21 @@ yyparse(YYPARSE_PARAM_ARG)
yylsp = yyls;
#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;
if (yyssp >= yyss + yystacksize - 1)
{
/* Give user a chance to reallocate the stack */
/* Use copies of these so that the &'s don't force the real ones into memory. */
/* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into memory.
*/
YYSTYPE *yyvs1 = yyvs;
short *yyss1 = yyss;
#ifdef YYLSP_NEEDED
@@ -432,6 +440,11 @@ yynewstate:
fprintf (stderr, "Entering state %d\n", yystate);
goto yybackup;
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. */
@@ -527,21 +540,30 @@ yynewstate:
*++yylsp = yylloc;
#endif
/* count tokens shifted since error; after three, turn off error status. */
if (yyerrstatus) yyerrstatus--;
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
yystate = yyn;
goto yynewstate;
/* Do the default action for the current state. */
yydefault:
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
/* Do a reduction. yyn is the number of a rule to reduce with. */
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn];
/* Implement default value of the action:
`{dollar}{dollar} = {dollar}1'. */
@@ -581,7 +603,7 @@ yyreduce:
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
}
#endif
$ /* the action file gets copied in in place of this dollarsign */
$ /* The action file replaces this line marked with this dollarsign. */
#line
yyvsp -= yylen;
@@ -618,10 +640,13 @@ $ /* the action file gets copied in in place of this dollarsign */
goto yynewstate;
yyerrlab: /* here on detecting error */
if (! yyerrstatus)
/*------------------------------------.
| yyerrlab -- here on detecting error |
`------------------------------------*/
yyerrlab:
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{
++yynerrs;
@@ -672,13 +697,17 @@ yyerrlab: /* here on detecting error */
#endif /* YYERROR_VERBOSE */
yyerror ("parse error");
}
goto yyerrlab1;
yyerrlab1: /* here on error raised explicitly by an action */
/*--------------------------------------------------.
| yyerrlab1 -- error raised explicitly by an action |
`--------------------------------------------------*/
yyerrlab1:
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 */
if (yychar == YYEOF)
@@ -691,25 +720,37 @@ yyerrlab1: /* here on error raised explicitly by an action */
yychar = YYEMPTY;
}
/* Else will try to reuse lookahead token
after shifting the error token. */
/* Else will try to reuse lookahead token after shifting the error
token. */
yyerrstatus = 3; /* Each real token shifted decrements this */
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
/* This is wrong; only states that explicitly want error tokens
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
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--;
yystate = *--yyssp;
#ifdef YYLSP_NEEDED
@@ -725,8 +766,11 @@ yyerrpop: /* pop the current state because it cannot handle the error token */
fprintf (stderr, "\n");
}
yyerrhandle:
/*--------------.
| yyerrhandle. |
`--------------*/
yyerrhandle:
yyn = yypact[yystate];
if (yyn == YYFLAG)
goto yyerrdefault;
@@ -760,8 +804,11 @@ yyerrhandle:
yystate = yyn;
goto yynewstate;
/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
/* YYACCEPT comes here. */
if (yyfree_stacks)
{
free (yyss);
@@ -772,8 +819,11 @@ yyerrhandle:
}
return 0;
/*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
/* YYABORT comes here. */
if (yyfree_stacks)
{
free (yyss);

View File

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