X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/297e263a0050959e0fd139ad66e71383fc9ac4db..95dbea81032ba903c0cb70dde1cee2bd8744fa8e:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index c932ba54..51896994 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -30,6 +30,7 @@ #include "quotearg.h" #include "reader.h" #include "symlist.h" +#include "symtab.h" #include "scan-gram.h" #include "scan-code.h" #include "xmemdup0.h" @@ -185,30 +186,30 @@ static char const *char_name (char); %token TAG_NONE "<>" %type CHAR -%printer { fputs (char_name ($$), stderr); } CHAR +%printer { fputs (char_name ($$), yyo); } CHAR /* braceless is not to be used for rule or symbol actions, as it calls code_props_plain_init. */ %type STRING "%{...%}" EPILOGUE braceless content.opt %type "{...}" "%?{...}" -%printer { fputs (quotearg_style (c_quoting_style, $$), stderr); } +%printer { fputs (quotearg_style (c_quoting_style, $$), yyo); } STRING -%printer { fprintf (stderr, "{\n%s\n}", $$); } +%printer { fprintf (yyo, "{\n%s\n}", $$); } braceless content.opt "{...}" "%{...%}" EPILOGUE -%type BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG variable -%printer { fputs ($$, stderr); } -%printer { fprintf (stderr, "[%s]", $$); } BRACKETED_ID -%printer { fprintf (stderr, "%s:", $$); } ID_COLON -%printer { fprintf (stderr, "%%%s", $$); } PERCENT_FLAG -%printer { fprintf (stderr, "<%s>", $$); } TAG +%type BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag variable +%printer { fputs ($$, yyo); } +%printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID +%printer { fprintf (yyo, "%s:", $$); } ID_COLON +%printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG +%printer { fprintf (yyo, "<%s>", $$); } TAG tag %type INT -%printer { fprintf (stderr, "%d", $$); } +%printer { fprintf (yyo, "%d", $$); } %type id id_colon string_as_id symbol symbol.prec -%printer { fprintf (stderr, "%s", $$->tag); } -%printer { fprintf (stderr, "%s:", $$->tag); } id_colon +%printer { fprintf (yyo, "%s", $$->tag); } +%printer { fprintf (yyo, "%s:", $$->tag); } id_colon %type precedence_declarator %type symbols.1 symbols.prec generic_symlist generic_symlist_item @@ -386,19 +387,17 @@ grammar_declaration: { grammar_start_symbol_set ($2, @2); } -| "%destructor" "{...}" generic_symlist +| code_props_type "{...}" generic_symlist { - symbol_list *list; - for (list = $3; list; list = list->next) - symbol_list_code_props_set (list, destructor, @2, $2); - symbol_list_free ($3); - } -| "%printer" "{...}" generic_symlist - { - symbol_list *list; - for (list = $3; list; list = list->next) - symbol_list_code_props_set (list, printer, @2, $2); - symbol_list_free ($3); + code_props code; + code_props_symbol_action_init (&code, $2, @2); + code_props_translate_code (&code); + { + symbol_list *list; + for (list = $3; list; list = list->next) + symbol_list_code_props_set (list, $1, &code); + symbol_list_free ($3); + } } | "%default-prec" { @@ -422,6 +421,13 @@ grammar_declaration: } ; +%type code_props_type; +%union {code_props_type code_type;}; +%printer { fprintf (yyo, "%s", code_props_type_string ($$)); } ; +code_props_type: + "%destructor" { $$ = destructor; } +| "%printer" { $$ = printer; } +; /*---------. | %union. | @@ -503,9 +509,9 @@ symbols.prec: ; symbol.prec: - symbol { $$ = $1; } - | symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); } - ; + symbol { $$ = $1; } +| symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); } +; /* One or more symbols to be %typed. */ symbols.1: @@ -522,9 +528,13 @@ generic_symlist: generic_symlist_item: symbol { $$ = symbol_list_sym_new ($1, @1); } -| TAG { $$ = symbol_list_type_new ($1, @1); } -| "<*>" { $$ = symbol_list_default_tagged_new (@1); } -| "<>" { $$ = symbol_list_default_tagless_new (@1); } +| tag { $$ = symbol_list_type_new ($1, @1); } +; + +tag: + TAG +| "<*>" { $$ = uniqstr_new ("*"); } +| "<>" { $$ = uniqstr_new (""); } ; /* One token definition. */ @@ -773,7 +783,8 @@ add_param (param_type type, char *decl, location loc) } if (! name_start) - complain_at (loc, _("missing identifier in parameter declaration")); + complain_at (loc, complaint, + _("missing identifier in parameter declaration")); else { char *name = xmemdup0 (name_start, strspn (name_start, alphanum)); @@ -793,7 +804,7 @@ version_check (location const *loc, char const *version) { if (strverscmp (version, PACKAGE_VERSION) > 0) { - complain_at (*loc, "require bison %s, but have %s", + complain_at (*loc, complaint, "require bison %s, but have %s", version, PACKAGE_VERSION); exit (EX_MISMATCH); } @@ -802,7 +813,7 @@ version_check (location const *loc, char const *version) static void gram_error (location const *loc, char const *msg) { - complain_at (*loc, "%s", msg); + complain_at (*loc, complaint, "%s", msg); } char const *