static void prepare_symbols (void) { MUSCLE_INSERT_INT ("tokens_number", ntokens); MUSCLE_INSERT_INT ("nterms_number", nvars); MUSCLE_INSERT_INT ("symbols_number", nsyms); MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); muscle_insert_symbol_number_table ("translate", token_translations, token_translations[0], 1, max_user_token_number + 1); /* tname -- token names. */ { int i; /* We assume that the table will be output starting at column 2. */ int j = 2; struct quoting_options *qo = clone_quoting_options (0); set_quoting_style (qo, c_quoting_style); set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS); for (i = 0; i < nsyms; i++) { char *cp = quotearg_alloc (symbols[i]->tag, -1, qo); /* Width of the next token, including the two quotes, the comma and the space. */ int width = strlen (cp) + 2; if (j + width > 75) { obstack_sgrow (&format_obstack, "\n "); j = 1; } if (i) obstack_1grow (&format_obstack, ' '); obstack_escape (&format_obstack, cp); free (cp); obstack_1grow (&format_obstack, ','); j += width; } free (qo); obstack_sgrow (&format_obstack, " ]b4_null["); /* Finish table and store. */ muscle_insert ("tname", obstack_finish0 (&format_obstack)); } /* Output YYTOKNUM. */ { int i; int *values = xnmalloc (ntokens, sizeof *values); for (i = 0; i < ntokens; ++i) values[i] = symbols[i]->user_token_number; muscle_insert_int_table ("toknum", values, values[0], 1, ntokens); free (values); } }
bool muscle_percent_define_flag_if (char const *variable) { uniqstr invalid_boolean_name = muscle_name (variable, "invalid_boolean"); bool result = false; if (muscle_percent_define_ifdef (variable)) { char *value = muscle_percent_define_get (variable); muscle_percent_define_check_kind (variable, muscle_keyword); if (value[0] == '\0' || STREQ (value, "true")) result = true; else if (STREQ (value, "false")) result = false; else if (!muscle_find_const (invalid_boolean_name)) { muscle_insert (invalid_boolean_name, ""); location loc = muscle_percent_define_get_loc (variable); complain (&loc, complaint, _("invalid value for %%define Boolean variable %s"), quote (variable)); } free (value); } else complain (NULL, fatal, _("%s: undefined %%define variable %s"), "muscle_percent_define_flag", quote (variable)); return result; }
static void prepare (void) { /* Flags. */ MUSCLE_INSERT_BOOL ("debug_flag", debug_flag); MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose); MUSCLE_INSERT_BOOL ("locations_flag", locations_flag); MUSCLE_INSERT_BOOL ("pure_flag", pure_parser); MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); /* File names. */ MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); #define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "") DEFINE (dir_prefix); DEFINE (parser_file_name); DEFINE (spec_defines_file); DEFINE (spec_file_prefix); DEFINE (spec_graph_file); DEFINE (spec_name_prefix); DEFINE (spec_outfile); DEFINE (spec_verbose_file); #undef DEFINE /* User Code. */ obstack_1grow (&pre_prologue_obstack, 0); obstack_1grow (&post_prologue_obstack, 0); muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack)); muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack)); /* Find the right skeleton file. */ if (!skeleton) { if (glr_parser || nondeterministic_parser) skeleton = "glr.c"; else skeleton = "yacc.c"; } /* About the skeletons. */ { char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR); MUSCLE_INSERT_C_STRING ("skeleton", skeleton); } }
static void prepare_symbols (void) { MUSCLE_INSERT_BOOL ("token_table", token_table_flag); MUSCLE_INSERT_INT ("tokens_number", ntokens); MUSCLE_INSERT_INT ("nterms_number", nvars); MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); muscle_insert_symbol_number_table ("translate", token_translations, token_translations[0], 1, max_user_token_number + 1); /* tname -- token names. */ { int i; /* We assume that the table will be output starting at column 2. */ int j = 2; for (i = 0; i < nsyms; i++) { char const *cp = quotearg_style (c_quoting_style, symbols[i]->tag); /* Width of the next token, including the two quotes, the comma and the space. */ int width = strlen (cp) + 2; if (j + width > 75) { obstack_sgrow (&format_obstack, "\n "); j = 1; } if (i) obstack_1grow (&format_obstack, ' '); MUSCLE_OBSTACK_SGROW (&format_obstack, cp); obstack_1grow (&format_obstack, ','); j += width; } /* Add a NULL entry to list of tokens (well, 0, as NULL might not be defined). */ obstack_sgrow (&format_obstack, " 0"); /* Finish table and store. */ obstack_1grow (&format_obstack, 0); muscle_insert ("tname", obstack_finish (&format_obstack)); } /* Output YYTOKNUM. */ { int i; int *values = xnmalloc (ntokens, sizeof *values); for (i = 0; i < ntokens; ++i) values[i] = symbols[i]->user_token_number; muscle_insert_int_table ("toknum", values, values[0], 1, ntokens); free (values); } }
void muscle_percent_define_insert (char const *var, location variable_loc, muscle_kind kind, char const *value, muscle_percent_define_how how) { /* Backward compatibility. */ char *variable = muscle_percent_variable_update (var, variable_loc, &value); uniqstr name = muscle_name (variable, NULL); uniqstr loc_name = muscle_name (variable, "loc"); uniqstr syncline_name = muscle_name (variable, "syncline"); uniqstr how_name = muscle_name (variable, "how"); uniqstr kind_name = muscle_name (variable, "kind"); /* Command-line options are processed before the grammar file. */ if (how == MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE && muscle_find_const (name)) { muscle_percent_define_how how_old = atoi (muscle_find_const (how_name)); unsigned i = 0; if (how_old == MUSCLE_PERCENT_DEFINE_F) goto end; complain_indent (&variable_loc, complaint, &i, _("%%define variable %s redefined"), quote (variable)); i += SUB_INDENT; location loc = muscle_percent_define_get_loc (variable); complain_indent (&loc, complaint, &i, _("previous definition")); } MUSCLE_INSERT_STRING (name, value); muscle_insert (loc_name, ""); muscle_location_grow (loc_name, variable_loc); muscle_insert (syncline_name, ""); muscle_syncline_grow (syncline_name, variable_loc); muscle_user_name_list_grow ("percent_define_user_variables", variable, variable_loc); MUSCLE_INSERT_INT (how_name, how); MUSCLE_INSERT_STRING (kind_name, muscle_kind_string (kind)); end: free (variable); }
void muscle_percent_define_default (char const *variable, char const *value) { uniqstr name = muscle_name (variable, NULL); if (!muscle_find_const (name)) { MUSCLE_INSERT_STRING (name, value); MUSCLE_INSERT_STRING (muscle_name (variable, "kind"), "keyword"); { uniqstr loc_name = muscle_name (variable, "loc"); location loc; loc.start.file = loc.end.file = "<default value>"; loc.start.line = loc.end.line = -1; loc.start.column = loc.end.column = -1; muscle_insert (loc_name, ""); muscle_location_grow (loc_name, loc); } muscle_insert (muscle_name (variable, "syncline"), ""); } }
/* Mark %define VARIABLE as used. */ static void muscle_percent_define_use (char const *variable) { muscle_insert (muscle_name (variable, "bison_variables"), ""); }