X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f0064700f86c809c4b91637d3c012e3893ebf637..927b425baae16fc1d50e092b78b944e281b521f6:/src/parse-gram.y?ds=sidebyside diff --git a/src/parse-gram.y b/src/parse-gram.y index 701b63b4..11cd489e 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -57,6 +57,19 @@ static uniqstr current_type = 0; static symbol *current_lhs; static location current_lhs_location; static int current_prec = 0; + +#ifdef UINT_FAST8_MAX +# define YYTYPE_UINT8 uint_fast8_t +#endif +#ifdef INT_FAST8_MAX +# define YYTYPE_INT8 int_fast8_t +#endif +#ifdef UINT_FAST16_MAX +# define YYTYPE_UINT16 uint_fast16_t +#endif +#ifdef INT_FAST16_MAX +# define YYTYPE_INT16 int_fast16_t +#endif %} %debug @@ -163,7 +176,6 @@ static int current_prec = 0; "%parse-param {...}" "%printer {...}" "%union {...}" - BRACED_CODE action PROLOGUE EPILOGUE %printer { fprintf (stderr, "\"%s\"", $$); } STRING string_content @@ -174,7 +186,6 @@ static int current_prec = 0; "%parse-param {...}" "%printer {...}" "%union {...}" - BRACED_CODE action PROLOGUE EPILOGUE %type TYPE %printer { fprintf (stderr, "<%s>", $$); } TYPE @@ -276,7 +287,7 @@ grammar_declaration: { symbol_list *list; for (list = $2; list; list = list->next) - symbol_printer_set (list->sym, $1, list->location); + symbol_printer_set (list->sym, $1, @1); symbol_list_free ($2); } | "%default-prec" @@ -417,7 +428,6 @@ rhs: | rhs symbol { grammar_current_rule_symbol_append ($2, @2); } | rhs action - { grammar_current_rule_action_append ($2, @2); } | rhs "%prec" symbol { grammar_current_rule_prec_set ($3, @3); } | rhs "%dprec" INT @@ -431,9 +441,21 @@ symbol: | string_as_id { $$ = $1; } ; +/* Handle the semantics of an action specially, with a mid-rule + action, so that grammar_current_rule_action_append is invoked + immediately after the braced code is read by the scanner. + + This implementation relies on the LALR(1) parsing algorithm. + If grammar_current_rule_action_append were executed in a normal + action for this rule, then when the input grammar contains two + successive actions, the scanner would have to read both actions + before reducing this rule. That wouldn't work, since the scanner + relies on all preceding input actions being processed by + grammar_current_rule_action_append before it scans the next + action. */ action: + { grammar_current_rule_action_append (last_string, last_braced_code_loc); } BRACED_CODE - { $$ = $1; } ; /* A string used as an ID: quote it. */