Предупреждения о бизонной грамматике
Я пишу парсер с Bison и получаю следующие предупреждения.
fol.y:42 parser name defined to default :"parse"
fol.y:61: warning: type clash ('' 'pred') on default action
Я использовал Google, чтобы найти способ избавиться от них, но почти ничего не понял о том, что они значат (а тем более о том, как их исправить), поскольку в каждом сообщении, которое я нашел с ними, есть ошибка компиляции и предупреждения. к ним самим не обращаются. Может кто-нибудь сказать мне, что они имеют в виду и как их исправить? Соответствующий код ниже. Строка 61 - последняя точка с запятой. Я вырезал остальную часть грамматики, так как она невероятно многословна.
%union {
char* var;
char* name;
char* pred;
}
%token <var> VARIABLE
%token <name> NAME
%token <pred> PRED
%%
fol:
declines clauses {cout << "Done parsing with file" << endl;}
;
declines:
declines decline
|decline
;
decline:
PRED decs
;
2 ответа
Первое сообщение скорее всего просто предупреждение, которое вы не включили %start parse
в спецификации грамматики.
Второе означает, что где-то у вас есть правило, которое должно возвращать значение, но вы не указали, какой тип значения оно должно возвращать. ПРЕД возвращает pred
элемент вашего union
; проблема может быть в том, что вы не создали %type
записи для decline
а также declines
, Если у вас есть объединение, вы должны указать тип для большинства, если не всех, правил - или, может быть, просто для правил, которые не имеют явного действия (чтобы переопределить значение по умолчанию). $$ = $1;
действие).
Я не уверен, что проблема в указанной вами строке, и поскольку у нас нет полного, минимального воспроизведения вашей проблемы, мы не можем провести расследование, чтобы вы ее подтвердили. Спецификация для decs
может быть актуальным (я не уверен, что это так, но это может быть).
Вы можете получить больше информации из вывода bison -v
, какой y.output
файл (или что-то подобное).
Наконец то нашел.
Чтобы исправить это:
fol.y: 42 имя парсера определено по умолчанию:"parse"
добавлять %name parse
до %token
Например:
%name parse
%token NUM
(От: https://bdhacker.wordpress.com/2012/05/05/flex-bison-in-ubuntu/)