Я думаю Перри анализ того, почему у вас проблемы, является правильным.
Мне удалось получить подобные предупреждения с этой полной грамматикой (идентичной вашей, но с правилами %token
, чтобы я мог ее скомпилировать):
%token STATIC IDENT FLOAT INT VOID LPAR RPAR EQ SEMI
%%
member_decl: field_decl | method_decl;
field_decl: STATIC type IDENT EQ SEMI;
method_decl: STATIC return_type IDENT LPAR RPAR;
type: INT | FLOAT;
return_type: type | VOID;
%%
Учитывая анализ, я бы, наверное, исправил это так:
%token STATIC IDENT FLOAT INT VOID LPAR RPAR EQ SEMI
%%
member_decl: field_decl | method_decl;
field_decl: STATIC type IDENT EQ SEMI;
method_decl: STATIC type IDENT LPAR RPAR;
type: INT | FLOAT | VOID;
%%
Компилируется без ошибок в Bison. Вам просто нужно добавить в обработку семантическую проверку для field_decl
, которая гарантирует, что соответствующий type
($2
) не является VOID
.