static void gram_error (location const *, char const *);
-/// A string that describes a char (e.g., 'a' -> "'a'").
+/* A string that describes a char (e.g., 'a' -> "'a'"). */
static char const *char_name (char);
%}
`------------------------------------*/
prologue_declarations:
- /* Nothing */
+ %empty
| prologue_declarations prologue_declaration
;
%token PERCENT_UNION "%union";
union_name:
- /* Nothing. */ {}
-| ID { muscle_code_grow ("union_name", $1, @1); }
+ %empty {}
+| ID { muscle_code_grow ("union_name", $1, @1); }
;
grammar_declaration:
;
tag.opt:
- /* Nothing. */ { current_type = NULL; }
-| TAG { current_type = $1; tag_seen = true; }
+ %empty { current_type = NULL; }
+| TAG { current_type = $1; tag_seen = true; }
;
/* Just like symbols.1 but accept INT for the sake of POSIX. */
| rhses.1 ";"
;
+%token PERCENT_EMPTY "%empty";
rhs:
- /* Nothing. */
+ %empty
{ grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
current_lhs_named_ref); }
| rhs symbol named_ref.opt
{ grammar_current_rule_action_append ($2, @2, $3, false); }
| rhs "%?{...}"
{ grammar_current_rule_action_append ($2, @2, NULL, true); }
+| rhs "%empty"
+ { grammar_current_rule_empty_set (@2); }
| rhs "%prec" symbol
{ grammar_current_rule_prec_set ($3, @3); }
| rhs "%dprec" INT
;
named_ref.opt:
- /* Nothing. */ { $$ = 0; }
-|
- BRACKETED_ID { $$ = named_ref_new ($1, @1); }
+ %empty { $$ = 0; }
+| BRACKETED_ID { $$ = named_ref_new($1, @1); }
;
/*---------------------------.
/* Some content or empty by default. */
content.opt:
- /* Nothing. */ { $$ = ""; }
-| ID { $$ = $1; }
-| STRING
+ %empty { $$ = ""; }
+| ID { $$ = $1; }
+| STRING { $$ = $1; }
;
;
epilogue.opt:
- /* Nothing. */
+ %empty
| "%%" EPILOGUE
{
code_props plain_code;