static void prepare (void) { /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented for the user. */ char const *cp = getenv ("BISON_USE_PUSH_FOR_PULL"); bool use_push_for_pull_flag = cp && *cp && strtol (cp, 0, 10); /* Flags. */ MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); MUSCLE_INSERT_BOOL ("glr_flag", glr_parser); MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser); MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen); MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag); MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag); /* File names. */ if (spec_name_prefix) MUSCLE_INSERT_STRING ("prefix", spec_name_prefix); MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext); #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 /* Find the right skeleton file, and add muscles about the skeletons. */ if (skeleton) MUSCLE_INSERT_C_STRING ("skeleton", skeleton); else skeleton = language->skeleton; /* About the skeletons. */ { /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs would never be expanded. Hopefully no one has M4-special characters in his Bison installation path. */ MUSCLE_INSERT_STRING_RAW ("pkgdatadir", pkgdatadir ()); } }
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); } }
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"), ""); } }
void muscle_init (void) { /* Initialize the muscle obstack. */ obstack_init (&muscle_obstack); muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle, hash_compare_muscles, muscle_entry_free); /* Version and input file. */ MUSCLE_INSERT_STRING ("version", VERSION); }
static void prepare_symbol_definitions (void) { int i; for (i = 0; i < nsyms; ++i) { symbol *sym = symbols[i]; const char *key; const char *value; #define SET_KEY(Entry) \ obstack_printf (&format_obstack, "symbol(%d, %s)", \ i, Entry); \ key = obstack_finish0 (&format_obstack); #define SET_KEY2(Entry, Suffix) \ obstack_printf (&format_obstack, "symbol(%d, %s_%s)", \ i, Entry, Suffix); \ key = obstack_finish0 (&format_obstack); /* Whether the symbol has an identifier. */ value = symbol_id_get (sym); SET_KEY ("has_id"); MUSCLE_INSERT_INT (key, !!value); /* Its identifier. */ SET_KEY ("id"); MUSCLE_INSERT_STRING (key, value ? value : ""); /* Its tag. Typically for documentation purpose. */ SET_KEY ("tag"); MUSCLE_INSERT_STRING (key, sym->tag); SET_KEY ("user_number"); MUSCLE_INSERT_INT (key, sym->user_token_number); SET_KEY ("is_token"); MUSCLE_INSERT_INT (key, i < ntokens && sym != errtoken && sym != undeftoken); SET_KEY ("number"); MUSCLE_INSERT_INT (key, sym->number); SET_KEY ("has_type"); MUSCLE_INSERT_INT (key, !!sym->type_name); SET_KEY ("type"); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); { int j; for (j = 0; j < CODE_PROPS_SIZE; ++j) { /* "printer", not "%printer". */ char const *pname = code_props_type_string (j) + 1; code_props const *p = symbol_code_props_get (sym, j); SET_KEY2 ("has", pname); MUSCLE_INSERT_INT (key, !!p->code); if (p->code) { SET_KEY2 (pname, "file"); MUSCLE_INSERT_STRING (key, p->location.start.file); SET_KEY2 (pname, "line"); MUSCLE_INSERT_INT (key, p->location.start.line); SET_KEY (pname); MUSCLE_INSERT_STRING_RAW (key, p->code); } } } #undef SET_KEY2 #undef SET_KEY } }