+decl_asm:
+ %empty
+| CPP_ASM LPAREN ignored_quoted_strings RPAREN
+;
+
+ignored_quoted_strings:
+ QUOTED_STRING
+| ignored_quoted_strings QUOTED_STRING
+;
+
+decl_extvar_stmt[list]:
+ NAME decl_arg decl_extvar_list[vars] EOS {
+ struct psi_plist *list = psi_plist_init((psi_plist_dtor) psi_decl_extvar_free);
+
+ if ($vars) {
+ size_t i = 0;
+ struct psi_decl_var *var;
+
+ while (psi_plist_get($vars, i++, &var)) {
+ if (psi_decl_extvar_is_blacklisted(var->name)) {
+ psi_decl_var_free(&var);
+ } else {
+ list = psi_plist_add(list, psi_decl_extvar_init(
+ psi_decl_arg_init(psi_decl_type_copy($decl_arg->type), var)));
+ }
+ }
+ free($vars);
+ }
+
+ if (psi_decl_extvar_is_blacklisted($decl_arg->var->name)) {
+ psi_decl_arg_free(&$decl_arg);
+ } else {
+ struct psi_decl_extvar *evar = psi_decl_extvar_init($decl_arg);
+ list = psi_plist_add(list, &evar);
+ }
+
+ $list = list;
+}
+;
+
+decl_extvar_list[list]:
+ %empty {
+ $list = NULL;
+}
+| COMMA decl_vars {
+ $list = $decl_vars;
+}
+;
+
+decl_vars[vars]:
+ decl_var[var] {
+ $vars = psi_plist_add(psi_plist_init((psi_plist_dtor) psi_decl_var_free), &$var);
+}
+| decl_vars[vars_] COMMA decl_var[var] {
+ $vars = psi_plist_add($vars_, &$var);
+}
+;
+
+ignored_decl:
+ STATIC decl_body ignored_decl_body {
+ psi_decl_free(&$decl_body);
+}
+| CPP_INLINE decl_body ignored_decl_body {
+ psi_decl_free(&$decl_body);
+}
+| STATIC CPP_INLINE decl_body ignored_decl_body {
+ psi_decl_free(&$decl_body);
+}
+;
+
+ignored_decl_body:
+ LBRACE ignored_decl_body_stmts RBRACE
+;
+
+ignored_decl_body_stmts:
+ ignored_decl_body_stmt
+| ignored_decl_body_stmts ignored_decl_body_stmt
+;
+
+ignored_decl_body_stmt:
+ any_nobrace_token
+| ignored_decl_body
+;
+