X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/29e8831621af57c5056380b68a96337e7647b850..ae4048011562c250d2f3c96687422d99a38745ce:/src/output.c diff --git a/src/output.c b/src/output.c index 45af9b7e..7b0e8f0c 100644 --- a/src/output.c +++ b/src/output.c @@ -101,7 +101,7 @@ #include "symtab.h" #include "conflicts.h" #include "muscle_tab.h" - +#include "skeleton.h" static int nvectors; static int nentries; @@ -125,7 +125,7 @@ static struct obstack format_obstack; int error_verbose = 0; /* Returns the number of lines of S. */ -static size_t +size_t get_lines_number (const char *s) { size_t lines = 0; @@ -503,7 +503,7 @@ token_actions (void) | Output the actions to OOUT. | `-----------------------------*/ -static void +void actions_output (FILE *out, size_t *line) { int rule; @@ -539,7 +539,7 @@ actions_output (FILE *out, size_t *line) | Output the guards to OOUT. | `----------------------------*/ -static void +void guards_output (FILE *out, size_t *line) { int rule; @@ -567,6 +567,54 @@ guards_output (FILE *out, size_t *line) } +/*---------------------------------------. +| Output the tokens definition to OOUT. | +`---------------------------------------*/ + +void +token_definitions_output (FILE *out, size_t *line) +{ + int i; + for (i = 0; i < ntokens; ++i) + { + bucket *symbol = symbols[i]; + int number = symbol->user_token_number; + + if (number == SALIAS) + continue; + /* Skip error token. */ + if (symbol->value == error_token_number) + continue; + if (symbol->tag[0] == '\'') + continue; /* skip literal character */ + if (symbol->tag[0] == '\"') + { + /* use literal string only if given a symbol with an alias */ + if (symbol->alias) + symbol = symbol->alias; + else + continue; + } + + /* Don't #define nonliteral tokens whose names contain periods + or '$' (as does the default value of the EOF token). */ + if (strchr (symbol->tag, '.') || strchr (symbol->tag, '$')) + continue; + + fprintf (out, "# define %s\t%d\n", + symbol->tag, number); + ++*line; + if (semantic_parser) + { + /* FIXME: This is probably wrong, and should be just as + above. --akim. */ + fprintf (out, "# define T%s\t%d\n", symbol->tag, symbol->value); + ++*line; + } + } +} + + static void save_column (int symbol, int default_state) { @@ -913,85 +961,14 @@ output_actions (void) } -/*------------------------------------------------------------. -| Copy the parser code from SKEL_FILENAME into OOUT obstack. | -| and do the muscle substitution. | -`------------------------------------------------------------*/ - -static void -output_parser (const char *skel_filename, FILE *out) -{ - int c; - FILE *fskel; - size_t output_line; - size_t skeleton_line; - - fskel = xfopen (skel_filename, "r"); - - /* New output code. */ - output_line = 1; - skeleton_line = 1; - c = getc (fskel); - while (c != EOF) - { - if (c != '%') - { - if (c == '\n') - { - ++output_line; - ++skeleton_line; - } - putc (c, out); - c = getc (fskel); - } - else if ((c = getc (fskel)) == '%') - { - /* Read the muscle. */ - const char *muscle_key = 0; - const char *muscle_value = 0; - - while (isalnum (c = getc (fskel)) || c == '-') - obstack_1grow (&muscle_obstack, c); - obstack_1grow (&muscle_obstack, 0); - - /* Output the right value, or see if it's something special. */ - muscle_key = obstack_finish (&muscle_obstack); - muscle_value = muscle_find (muscle_key); - if (!strcmp (muscle_key, "actions")) - actions_output (out, &output_line); - else if (!strcmp (muscle_key, "guards")) - guards_output (out, &output_line); - else if (!strcmp (muscle_key, "line")) - fprintf (out, "%d", output_line); - else if (!strcmp (muscle_key, "skeleton-line")) - fprintf (out, "%d", skeleton_line); - else if (muscle_value) - { - fputs (muscle_value, out); - output_line += get_lines_number (muscle_value); - } - else - { - fputs ("%%", out); - fputs (muscle_key, out); - } - } - else - putc ('%', out); - } - - /* End. */ - xfclose (fskel); -} - -/*----------------------------------------. -| Prepare the master parser to be output | -`----------------------------------------*/ +/*---------------------------. +| Call the skeleton parser. | +`---------------------------*/ static void -output_master_parser (void) +output_skeleton (void) { - FILE *parser = xfopen (parser_file_name, "w"); + /* Find the right skeleton file. */ if (!skeleton) { if (semantic_parser) @@ -999,35 +976,10 @@ output_master_parser (void) else 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); -} - - -/* FIXME. */ - -#define MUSCLE_INSERT_INT(Key, Value) \ -{ \ - obstack_fgrow1 (&muscle_obstack, "%d", Value); \ - obstack_1grow (&muscle_obstack, 0); \ - muscle_insert (Key, obstack_finish (&muscle_obstack)); \ -} - -#define MUSCLE_INSERT_STRING(Key, Value) \ -{ \ - obstack_sgrow (&muscle_obstack, Value); \ - obstack_1grow (&muscle_obstack, 0); \ - muscle_insert (Key, obstack_finish (&muscle_obstack)); \ -} - -#define MUSCLE_INSERT_PREFIX(Key, Value) \ -{ \ - obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \ - obstack_1grow (&muscle_obstack, 0); \ - muscle_insert (Key, obstack_finish (&muscle_obstack)); \ + /* Parse the skeleton file and output the needed parsers. */ + muscle_insert ("skeleton", skeleton); + process_skeleton (skeleton); } static void @@ -1041,7 +993,7 @@ prepare (void) MUSCLE_INSERT_INT ("final", final_state); MUSCLE_INSERT_INT ("maxtok", max_user_token_number); MUSCLE_INSERT_INT ("error-verbose", error_verbose); - MUSCLE_INSERT_STRING ("prefix", spec_name_prefix); + MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); MUSCLE_INSERT_INT ("nnts", nvars); MUSCLE_INSERT_INT ("nrules", nrules); @@ -1051,7 +1003,6 @@ prepare (void) MUSCLE_INSERT_INT ("locations-flag", locations_flag); } - /*-------------------------. | Output the header file. | `-------------------------*/ @@ -1059,13 +1010,14 @@ prepare (void) static void header_output (void) { + size_t dummy_line; FILE *out = xfopen (spec_defines_file, "w"); char *macro_name = compute_header_macro (); fprintf (out, "#ifndef %s\n", macro_name); fprintf (out, "# define %s\n\n", macro_name); - fputs (muscle_find ("tokendef"), out); + token_definitions_output (out, &dummy_line); fprintf (out, "\ #ifndef YYSTYPE\n\ typedef %s @@ -1076,7 +1028,27 @@ yystype;\n\ if (!pure_parser) fprintf (out, "\nextern YYSTYPE %slval;\n", - spec_name_prefix); + spec_name_prefix ? spec_name_prefix : "yy"); + + if (locations_flag) + { + fputs ("\n\n", out); + fprintf (out, "\ +#ifndef YYLTYPE\n\ +typedef struct yyltype\n\ +{\n\ + int first_line;\n\ + int first_column;\n\ + int last_line;\n\ + int last_column;\n\ +} yyltype;\n\ +# define YYLTYPE yyltype\n\ +#endif\n"); + if (!pure_parser) + fprintf (out, "\nextern YYLTYPE %slloc;\n", + spec_name_prefix ? spec_name_prefix : "yy"); + } + if (semantic_parser) { int i; @@ -1116,8 +1088,9 @@ output (void) obstack_1grow (&attrs_obstack, 0); muscle_insert ("prologue", obstack_finish (&attrs_obstack)); - /* Output the parser. */ - output_master_parser (); + /* Process the selected skeleton file. */ + output_skeleton (); + /* Output the header if needed. */ if (defines_flag) header_output ();