X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/4920ae8b66cb55e575043d67b4d7cda7e8dfdc92..b9f1d9a47a49c40e8f0a5006b492daba53f25b20:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index 72771056..0fbb8cbd 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -26,10 +26,11 @@ #include "files.h" #include "getargs.h" #include "gram.h" -#include "muscle_tab.h" +#include "muscle-tab.h" #include "quotearg.h" #include "reader.h" #include "symlist.h" +#include "named-ref.h" #include "scan-gram.h" #include "scan-code.h" @@ -63,6 +64,7 @@ static symbol_class current_class = unknown_sym; static uniqstr current_type = NULL; static symbol *current_lhs; static location current_lhs_location; +static named_ref *current_lhs_named_ref; static int current_prec = 0; #define YYTYPE_INT16 int_fast16_t @@ -98,6 +100,7 @@ static int current_prec = 0; assoc assoc; uniqstr uniqstr; unsigned char character; + named_ref *named_ref; }; /* Define the tokens together with their human representation. */ @@ -139,7 +142,6 @@ static int current_prec = 0; PERCENT_INITIAL_ACTION "%initial-action" PERCENT_LANGUAGE "%language" PERCENT_LEX_PARAM "%lex-param" - PERCENT_LOCATIONS "%locations" PERCENT_NAME_PREFIX "%name-prefix" PERCENT_NO_DEFAULT_PREC "%no-default-prec" PERCENT_NO_LINES "%no-lines" @@ -168,6 +170,7 @@ static int current_prec = 0; %token TAG "" %token TAG_ANY "<*>" %token TAG_NONE "<>" +%token BRACKETED_ID "[id]" %type CHAR %printer { fputs (char_name ($$), stderr); } CHAR @@ -181,7 +184,8 @@ static int current_prec = 0; %printer { fprintf (stderr, "{\n%s\n}", $$); } braceless content.opt "{...}" "%{...%}" EPILOGUE -%type TAG ID ID_COLON PERCENT_FLAG variable +%type TAG ID ID_COLON BRACKETED_ID PERCENT_FLAG variable +%type named_ref.opt %printer { fputs ($$, stderr); } ID variable %printer { fprintf (stderr, "%s:", $$); } ID_COLON %printer { fprintf (stderr, "%%%s", $$); } PERCENT_FLAG @@ -230,7 +234,8 @@ prologue_declaration: } | "%define" variable content.opt { - muscle_percent_define_insert ($2, @2, $3); + muscle_percent_define_insert ($2, @2, $3, + MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); } | "%defines" { defines_flag = true; } | "%defines" STRING @@ -258,7 +263,6 @@ prologue_declaration: } | "%language" STRING { language_argmatch ($2, grammar_prio, @1); } | "%lex-param" "{...}" { add_param ("lex_param", $2, @2); } -| "%locations" { locations_flag = true; } | "%name-prefix" STRING { spec_name_prefix = $2; } | "%name-prefix" "=" STRING { spec_name_prefix = $3; } /* deprecated */ | "%no-lines" { no_lines_flag = true; } @@ -506,7 +510,8 @@ rules_or_grammar_declaration: ; rules: - id_colon { current_lhs = $1; current_lhs_location = @1; } rhses.1 + id_colon named_ref.opt { current_lhs = $1; current_lhs_location = @1; + current_lhs_named_ref = $2; } rhses.1 ; rhses.1: @@ -517,11 +522,12 @@ rhses.1: rhs: /* Nothing. */ - { grammar_current_rule_begin (current_lhs, current_lhs_location); } -| rhs symbol - { grammar_current_rule_symbol_append ($2, @2); } -| rhs "{...}" - { grammar_current_rule_action_append ($2, @2); } + { grammar_current_rule_begin (current_lhs, current_lhs_location, + current_lhs_named_ref); } +| rhs symbol named_ref.opt + { grammar_current_rule_symbol_append ($2, @2, $3); } +| rhs "{...}" named_ref.opt + { grammar_current_rule_action_append ($2, @2, $3); } | rhs "%prec" symbol { grammar_current_rule_prec_set ($3, @3); } | rhs "%dprec" INT @@ -530,22 +536,29 @@ rhs: { grammar_current_rule_merge_set ($3, @3); } ; +named_ref.opt: + /* Nothing. */ + { $$ = 0; } +| + BRACKETED_ID + { $$ = named_ref_new($1, @1); } +; + /*---------------------------. | variable and content.opt. | `---------------------------*/ +/* The STRING form of variable is deprecated and is not M4-friendly. + For example, M4 fails for `%define "[" "value"'. */ variable: ID -| STRING { $$ = uniqstr_new ($1); } /* deprecated and not M4-friendly */ +| STRING { $$ = uniqstr_new ($1); } ; /* Some content or empty by default. */ content.opt: - /* Nothing. */ - { - $$ = ""; - } + /* Nothing. */ { $$ = ""; } | STRING ;