Как и другие, предпочтительным способом было бы иметь модификатор структуры с видимостью и статическими параметрами. Но я бы, вероятно, сделал это статическим модификатором, так как он не будет передан в поле, а вместо этого просто использован для извлечения значений, а затем передан в поле. Вы даже можете разместить его в стеке и использовать повторно, чтобы сделать это быстрее.
Что-то вроде следующего:
static struct { boolean vis_opt; boolean static_opt; } mod;
field
: modifier type TOK_IDENT TOK_SEMICOLON
{
$$ = new Field(..., mod.vis_opt, mod.static_opt, ...);
}
;
modifier
: visibility_opt static_opt
{
mod.vis_opt = $1;
mod.static_opt = $2;
}
;
visibility_opt
: /* default */ { $$ = true; }
| TOK_PUBLIC { $$ = true; }
| TOK_PRIVATE { $$ = false; }
;
static_opt
: /* default */ { $$ = false; }
| TOK_STATIC { $$ = true; }
;
Кроме того, если вы не уверены в будущем языка, возможно, вы захотите сделать перечисление видимым. Вы никогда не знаете, о каких типах visibilit'ies вы можете мечтать при разработке языка, и, по крайней мере, если у вас это есть в перечислении, его будет легче расширить позже.
Наслаждайтесь.