X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7ec2d4cd3932bfba78e9fbd52509d9f80b61c8ef..6ba555928922e7b96b05e0032737f6974ac78702:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index c10c82ac..dcdd9f52 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -40,7 +40,7 @@ #include "reader.h" #include "conflicts.h" -/* Produce verbose parse errors. */ +/* Produce verbose syntax errors. */ #define YYERROR_VERBOSE 1 #define YYLLOC_DEFAULT(Current, Rhs, N) \ do { \ @@ -57,22 +57,18 @@ do { \ } \ } while (0) -/* Pass the control structure to YYPARSE and YYLEX. */ -#define YYPARSE_PARAM gram_control -#define YYLEX_PARAM gram_control -/* YYPARSE receives GRAM_CONTROL as a void *. Provide a - correctly typed access to it. */ -#define yycontrol ((gram_control_t *) gram_control) - -/* Request detailed parse error messages, and pass them to GRAM_ERROR. - FIXME: depends on the undocumented availability of YYLLOC.t */ +/* Request detailed syntax error messages, and pass them to GRAM_ERROR. + FIXME: depends on the undocumented availability of YYLLOC. */ #undef yyerror #define yyerror(Msg) \ gram_error (&yylloc, Msg) +static void gram_error (location_t const *, char const *); #define YYPRINT(File, Type, Value) \ - yyprint (File, Type, &Value) -static void yyprint (FILE *file, int type, const yystype *value); + print_token_value (File, Type, &Value) +static void print_token_value (FILE *, int, YYSTYPE const *); + +static void add_param (char const *, char const *, location_t); symbol_class current_class = unknown_sym; struniq_t current_type = 0; @@ -148,7 +144,6 @@ braced_code_t current_braced_code = action_braced_code; %token EQUAL "=" %token SEMICOLON ";" %token COLON ":" -%token COMMA "," %token PIPE "|" %token ID "identifier" %token PERCENT_PERCENT "%%" @@ -158,7 +153,7 @@ braced_code_t current_braced_code = action_braced_code; %type STRING string_content - BRACED_CODE action + BRACED_CODE code_content action PROLOGUE EPILOGUE %type TYPE %type INT @@ -169,9 +164,6 @@ braced_code_t current_braced_code = action_braced_code; input: declarations "%%" grammar epilogue.opt - { - yycontrol->errcode = 0; - } ; @@ -194,14 +186,12 @@ declaration: | "%expect" INT { expected_conflicts = $2; } | "%file-prefix" "=" string_content { spec_file_prefix = $3; } | "%glr-parser" { glr_parser = 1; } -| "%lex-param" string_content "," string_content - { muscle_pair_list_grow ("lex_param", $2, $4); } +| "%lex-param" code_content { add_param ("lex_param", $2, @2); } | "%locations" { locations_flag = 1; } | "%name-prefix" "=" string_content { spec_name_prefix = $3; } | "%no-lines" { no_lines_flag = 1; } | "%output" "=" string_content { spec_outfile = $3; } -| "%parse-param" string_content "," string_content - { muscle_pair_list_grow ("parse_param", $2, $4); } +| "%parse-param" code_content { add_param ("parse_param", $2, @2); } | "%pure-parser" { pure_parser = 1; } | "%skeleton" string_content { skeleton = $2; } | "%token-table" { token_table_flag = 1; } @@ -416,6 +406,15 @@ string_content: }; +/* A BRACED_CODE used for its contents. Strip the braces. */ +code_content: + BRACED_CODE + { + $$ = $1 + 1; + $$[strlen ($$) - 1] = '\0'; + }; + + epilogue.opt: /* Nothing. */ | "%%" EPILOGUE @@ -430,13 +429,50 @@ semi_colon.opt: | ";" ; %% +static void +add_param (char const *type, char const *decl, location_t loc) +{ + static char const alphanum[] = + "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "_"; + char const *alpha = alphanum + 10; + char const *name_start = NULL; + char const *p; + + for (p = decl; *p; p++) + if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0])) + name_start = p; + + if (! name_start) + complain_at (loc, _("missing identifier in parameter declaration")); + else + { + char *name; + size_t name_len; + + for (name_len = 1; + name_start[name_len] && strchr (alphanum, name_start[name_len]); + name_len++) + continue; + + name = xmalloc (name_len + 1); + memcpy (name, name_start, name_len); + name[name_len] = '\0'; + muscle_pair_list_grow (type, decl, name); + free (name); + } + + scanner_last_string_free (); +} + /*------------------------------------------------------------------. | When debugging the parser, display tokens' locations and values. | `------------------------------------------------------------------*/ static void -yyprint (FILE *file, - int type, const yystype *value) +print_token_value (FILE *file, int type, YYSTYPE const *value) { fputc (' ', file); switch (type) @@ -469,8 +505,8 @@ yyprint (FILE *file, } } -void -gram_error (location_t *yylloc, const char *msg) +static void +gram_error (location_t const *loc, char const *msg) { - complain_at (*yylloc, "%s", msg); + complain_at (*loc, "%s", msg); }