From e4d33cf57914b3718762183bcc9237fc03f3c1fe Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 13 Jun 2020 10:47:12 +0200 Subject: [PATCH] regen --- src/parse-gram.c | 212 +++++++++++++++++++++++++++++++++++++---------- src/parse-gram.h | 9 +- 2 files changed, 177 insertions(+), 44 deletions(-) diff --git a/src/parse-gram.c b/src/parse-gram.c index d68edb41..06da9269 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.6.3.74-5ca2. */ +/* A Bison parser, made by GNU Bison 3.6.3.87-3efc5-dirty. */ /* Bison implementation for Yacc-like parsers in C @@ -49,7 +49,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.6.3.74-5ca2" +#define YYBISON_VERSION "3.6.3.87-3efc5-dirty" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -257,17 +257,20 @@ typedef enum yysymbol_kind_t yysymbol_kind_t; static char *strip_braces (char *code); /* Convert CODE by calling code_props_plain_init if PLAIN, otherwise - code_props_symbol_action_init. Call + code_props_symbol_action_init. Calls gram_scanner_last_string_free to release the latest string from the scanner (should be CODE). */ static char const *translate_code (char *code, location loc, bool plain); /* Convert CODE by calling code_props_plain_init after having stripped the first and last characters (expected to be '{', and - '}'). Call gram_scanner_last_string_free to release the latest + '}'). Calls gram_scanner_last_string_free to release the latest string from the scanner (should be CODE). */ static char const *translate_code_braceless (char *code, location loc); + /* Handle a %defines directive. */ + static void handle_defines (char const *value); + /* Handle a %error-verbose directive. */ static void handle_error_verbose (location const *loc, char const *directive); @@ -276,6 +279,9 @@ typedef enum yysymbol_kind_t yysymbol_kind_t; location const *dir_loc, char const *directive, char const *value); + /* Handle a %language directive. */ + static void handle_language (location const *loc, char const *lang); + /* Handle a %name-prefix directive. */ static void handle_name_prefix (location const *loc, char const *directive, char const *value); @@ -302,6 +308,13 @@ typedef enum yysymbol_kind_t yysymbol_kind_t; static void tron (FILE *yyo); static void troff (FILE *yyo); + /* Interpret a quoted string (such as `"Hello, \"World\"\n\""`). + Manages the memory of the result. */ + static char *unquote (const char *str); + + /* Discard the latest unquoted string. */ + static void unquote_free (char *last_string); + /** Add a lex-param and/or a parse-param. * * \param type where to push this formal argument. @@ -621,19 +634,19 @@ union yyalloc /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 287, 287, 296, 297, 301, 302, 308, 312, 317, - 318, 323, 324, 325, 326, 327, 332, 337, 338, 339, - 340, 341, 342, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 354, 355, 364, 365, 369, 380, 384, 388, - 396, 406, 407, 417, 418, 424, 437, 437, 442, 442, - 447, 451, 461, 462, 463, 464, 468, 469, 474, 475, - 479, 480, 484, 485, 486, 499, 508, 512, 516, 524, - 525, 529, 542, 543, 548, 549, 550, 568, 572, 576, - 584, 586, 591, 598, 608, 612, 616, 624, 629, 641, - 642, 648, 649, 650, 657, 657, 665, 666, 667, 672, - 675, 677, 679, 681, 683, 685, 687, 689, 691, 696, - 697, 706, 730, 731, 732, 733, 745, 747, 771, 776, - 777, 782, 790, 791 + 0, 308, 308, 317, 318, 322, 323, 329, 333, 338, + 339, 340, 341, 342, 343, 344, 349, 354, 355, 356, + 357, 358, 359, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 371, 372, 381, 382, 386, 397, 401, 405, + 413, 423, 424, 434, 435, 441, 454, 454, 459, 459, + 464, 468, 478, 479, 480, 481, 485, 486, 491, 492, + 496, 497, 501, 502, 503, 516, 525, 529, 533, 541, + 542, 546, 559, 560, 565, 566, 567, 585, 589, 593, + 601, 603, 608, 615, 625, 629, 633, 641, 646, 658, + 659, 665, 666, 667, 674, 674, 682, 683, 684, 689, + 692, 694, 696, 698, 700, 702, 704, 706, 708, 713, + 714, 723, 747, 748, 749, 750, 762, 764, 788, 793, + 794, 799, 807, 808 }; #endif @@ -2081,10 +2094,7 @@ yyreduce: break; case 10: /* prologue_declaration: "%defines" "string" */ - { - defines_flag = true; - spec_header_file = xstrdup ((yyvsp[0].STRING)); - } + { handle_defines ((yyvsp[0].STRING)); } break; case 11: /* prologue_declaration: "%error-verbose" */ @@ -2118,7 +2128,7 @@ yyreduce: break; case 17: /* prologue_declaration: "%language" "string" */ - { language_argmatch ((yyvsp[0].STRING), grammar_prio, (yylsp[-1])); } + { handle_language (&(yylsp[-1]), (yyvsp[0].STRING)); } break; case 18: /* prologue_declaration: "%name-prefix" "string" */ @@ -2134,7 +2144,7 @@ yyreduce: break; case 21: /* prologue_declaration: "%output" "string" */ - { spec_outfile = (yyvsp[0].STRING); } + { spec_outfile = unquote ((yyvsp[0].STRING)); gram_scanner_last_string_free (); } break; case 22: /* $@1: %empty */ @@ -2387,7 +2397,7 @@ yyreduce: case 76: /* alias: "translatable string" */ { - (yyval.alias) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].TSTRING)), (yylsp[0])); + (yyval.alias) = symbol_get ((yyvsp[0].TSTRING), (yylsp[0])); symbol_class_set ((yyval.alias), token_sym, (yylsp[0]), false); (yyval.alias)->translatable = true; } @@ -2543,11 +2553,11 @@ yyreduce: break; case 114: /* value: "string" */ - { (yyval.value).kind = muscle_string; (yyval.value).chars = (yyvsp[0].STRING); } + { (yyval.value).kind = muscle_string; (yyval.value).chars = unquote ((yyvsp[0].STRING)); gram_scanner_last_string_free ();} break; case 115: /* value: "{...}" */ - { (yyval.value).kind = muscle_code; (yyval.value).chars = strip_braces ((yyvsp[0].BRACED_CODE)); } + { (yyval.value).kind = muscle_code; (yyval.value).chars = strip_braces ((yyvsp[0].BRACED_CODE)); gram_scanner_last_string_free (); } break; case 116: /* id: "identifier" */ @@ -2583,7 +2593,7 @@ yyreduce: case 121: /* string_as_id: "string" */ { - (yyval.string_as_id) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].STRING)), (yylsp[0])); + (yyval.string_as_id) = symbol_get ((yyvsp[0].STRING), (yylsp[0])); symbol_class_set ((yyval.string_as_id), token_sym, (yylsp[0]), false); } break; @@ -2940,6 +2950,17 @@ add_param (param_type type, char *decl, location loc) } +static void +handle_defines (char const *value) +{ + defines_flag = true; + char *file = unquote (value); + spec_header_file = xstrdup (file); + gram_scanner_last_string_free (); + unquote_free (file); +} + + static void handle_error_verbose (location const *loc, char const *directive) { @@ -2952,8 +2973,9 @@ handle_error_verbose (location const *loc, char const *directive) static void handle_file_prefix (location const *loc, location const *dir_loc, - char const *directive, char const *value) + char const *directive, char const *value_quoted) { + char *value = unquote (value_quoted); bison_directive (loc, directive); bool warned = false; @@ -2973,11 +2995,18 @@ handle_file_prefix (location const *loc, deprecated_directive (dir_loc, directive, "%file-prefix"); } +static void +handle_language (location const *loc, char const *lang) +{ + language_argmatch (unquote (lang), grammar_prio, *loc); +} + static void handle_name_prefix (location const *loc, - char const *directive, char const *value) + char const *directive, char const *value_quoted) { + char *value = unquote (value_quoted); bison_directive (loc, directive); char buf1[1024]; @@ -3049,34 +3078,39 @@ str_to_version (char const *version) static void -handle_require (location const *loc, char const *version) +handle_require (location const *loc, char const *version_quoted) { + char *version = unquote (version_quoted); required_version = str_to_version (version); if (required_version == -1) { complain (loc, complaint, _("invalid version requirement: %s"), version); required_version = 0; - return; } - - /* Pretend to be at least that version, to check features published - in that version while developping it. */ - const char* api_version = "3.6"; - const char* package_version = - 0 < strverscmp (api_version, PACKAGE_VERSION) - ? api_version : PACKAGE_VERSION; - if (0 < strverscmp (version, package_version)) + else { - complain (loc, complaint, _("require bison %s, but have %s"), - version, package_version); - exit (EX_MISMATCH); + /* Pretend to be at least that version, to check features published + in that version while developping it. */ + const char* api_version = "3.6"; + const char* package_version = + 0 < strverscmp (api_version, PACKAGE_VERSION) + ? api_version : PACKAGE_VERSION; + if (0 < strverscmp (version, package_version)) + { + complain (loc, complaint, _("require bison %s, but have %s"), + version, package_version); + exit (EX_MISMATCH); + } } + unquote_free (version); + gram_scanner_last_string_free (); } static void -handle_skeleton (location const *loc, char const *skel) +handle_skeleton (location const *loc, char const *skel_quoted) { + char *skel = unquote (skel_quoted); char const *skeleton_user = skel; if (strchr (skeleton_user, '/')) { @@ -3157,3 +3191,95 @@ static void troff (FILE *yyo) { end_use_class ("value", yyo); } + + +/*----------. +| Unquote. | +`----------*/ + +struct obstack obstack_for_unquote; + +void +parser_init (void) +{ + obstack_init (&obstack_for_unquote); +} + +void +parser_free (void) +{ + obstack_free (&obstack_for_unquote, 0); +} + +static void +unquote_free (char *last_string) +{ + obstack_free (&obstack_for_unquote, last_string); +} + +static char * +unquote (const char *cp) +{ +#define GROW(Char) \ + obstack_1grow (&obstack_for_unquote, Char); + for (++cp; *cp && *cp != '"'; ++cp) + switch (*cp) + { + case '"': + break; + case '\\': + ++cp; + switch (*cp) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + int c = cp[0] - '0'; + if (c_isdigit (cp[1])) + { + ++cp; + c = c * 8 + cp[0] - '0'; + } + if (c_isdigit (cp[1])) + { + ++cp; + c = c * 8 + cp[0] - '0'; + } + GROW (c); + } + break; + + case 'a': GROW ('\a'); break; + case 'b': GROW ('\b'); break; + case 'f': GROW ('\f'); break; + case 'n': GROW ('\n'); break; + case 'r': GROW ('\r'); break; + case 't': GROW ('\t'); break; + case 'v': GROW ('\v'); break; + + case 'x': + { + int c = 0; + while (c_isxdigit (cp[1])) + { + ++cp; + c = (c * 16 + (c_isdigit (cp[0]) ? cp[0] - '0' + : c_isupper (cp[0]) ? cp[0] - 'A' + : cp[0] - '0')); + } + GROW (c); + break; + } + } + break; + + default: + GROW (*cp); + break; + } + assert (*cp == '"'); + ++cp; + assert (*cp == '\0'); +#undef GROW + return obstack_finish0 (&obstack_for_unquote); +} diff --git a/src/parse-gram.h b/src/parse-gram.h index 2ce793f5..6d0baa84 100644 --- a/src/parse-gram.h +++ b/src/parse-gram.h @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.6.3.74-5ca2. */ +/* A Bison parser, made by GNU Bison 3.6.3.87-3efc5-dirty. */ /* Bison interface for Yacc-like parsers in C @@ -215,5 +215,12 @@ struct GRAM_LTYPE int gram_parse (void); +/* "%code provides" blocks. */ + + /* Initialize unquote. */ + void parser_init (void); + /* Deallocate storage for unquote. */ + void parser_free (void); + #endif /* !YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED */