X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/b5c212b61a73e905c94c7a488fa7676021a1dad6..b9f1d9a47a49c40e8f0a5006b492daba53f25b20:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index 8718a6d3..0fbb8cbd 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 "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. */ @@ -167,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 @@ -180,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 @@ -505,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: @@ -516,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 @@ -529,6 +536,14 @@ rhs: { grammar_current_rule_merge_set ($3, @3); } ; +named_ref.opt: + /* Nothing. */ + { $$ = 0; } +| + BRACKETED_ID + { $$ = named_ref_new($1, @1); } +; + /*---------------------------. | variable and content.opt. |