From f0440388e9b85171b4f6ea3ecf95dc82799fffc1 Mon Sep 17 00:00:00 2001 From: Marc Autret Date: Sun, 16 Dec 2001 01:26:25 +0000 Subject: [PATCH] * src/bison.simple: Remove a useless #line directive. s/#line %%line %%skeleton/#line %%line "%%parser-file-name"/'. * src/output.c (get_lines_number): New. (output_parser): Adjust, now takes care about the lines of a output muscles. Fix line numbering. (actions_output): Computes the number of lines taken by actions. (output_master_parser): Insert new skeleton which is the name of the output parser file name. --- ChangeLog | 12 ++++++++++++ src/bison.simple | 8 ++++---- src/output.c | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5c475cc2..ed88b5cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-12-16 Marc Autret + + * src/bison.simple: Remove a useless #line directive. + s/#line %%line %%skeleton/#line %%line "%%parser-file-name"/'. + * src/output.c (get_lines_number): New. + (output_parser): Adjust, now takes care about the lines of a + output muscles. + Fix line numbering. + (actions_output): Computes the number of lines taken by actions. + (output_master_parser): Insert new skeleton which is the name of + the output parser file name. + 2001-12-15 Marc Autret * src/bison.simple [YYERROR_VERBOSE]: Restore backward compatibility. diff --git a/src/bison.simple b/src/bison.simple index 0e121d22..7b6c079f 100644 --- a/src/bison.simple +++ b/src/bison.simple @@ -82,7 +82,8 @@ typedef struct yyltype /* Copy the user declarations. */ %%prologue -#line %%line "%%skeleton" +/* Line 85 of bison.simple. */ +#line %%line "%%parser-file-name" #include @@ -511,8 +512,6 @@ yystpcpy (yydest, yysrc) -#line %%line "%%skeleton" - /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. It should actually point to an object. @@ -897,7 +896,8 @@ yyreduce: { %%actions } -#line %%line "%%skeleton" + /* Line 902 of bison.simple. */ +#line %%line "%%parser-file-name" yyvsp -= yylen; yyssp -= yylen; diff --git a/src/output.c b/src/output.c index 0396234d..4de58e9e 100644 --- a/src/output.c +++ b/src/output.c @@ -125,6 +125,23 @@ struct obstack output_obstack; int error_verbose = 0; +/* Returns the number of lines of S. */ +static size_t +get_lines_number (const char *s) +{ + size_t lines = 0; + + size_t i; + for (i = 0; s[i]; ++i) + { + if (s[i] == '\n') + ++lines; + } + + return lines; +} + + /* FIXME. */ static inline void @@ -519,7 +536,7 @@ token_actions (void) `-----------------------------*/ static void -actions_output (FILE *out) +actions_output (FILE *out, size_t *line) { int rule; for (rule = 1; rule < nrules + 1; ++rule) @@ -538,6 +555,11 @@ actions_output (FILE *out) fprintf (out, "{ %s%s }\n break;\n\n", rule_table[rule].action, yacc_flag ? ";" : ""); + + /* We always output 5 '\n' per action. */ + *line += 5; + /* Get the number of lines written by the user. */ + *line += get_lines_number (rule_table[rule].action); } } @@ -962,11 +984,14 @@ output_parser (const char *skel_filename, FILE *out) muscle_key = obstack_finish (&muscle_obstack); muscle_value = muscle_find (muscle_key); if (!strcmp (muscle_key, "actions")) - actions_output (out); + actions_output (out, &line); else if (!strcmp (muscle_key, "line")) - fprintf (out, "%d", line + 1); + fprintf (out, "%d", line); else if (muscle_value) - fputs (muscle_value, out); + { + fputs (muscle_value, out); + line += get_lines_number (muscle_value); + } else { fputs ("%%", out); @@ -997,6 +1022,7 @@ output_master_parser (void) skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE); } muscle_insert ("skeleton", skeleton); + muscle_insert ("parser-file-name", parser_file_name); output_parser (skeleton, parser); xfclose (parser); -- 2.45.2