2012-04-19 2 views
0

Я пишу парсер с Bison, и я получаю следующие предупреждения.Предупреждения о грамматике 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 
     ; 

ответ

1

Первое сообщение, скорее всего, просто предупреждение, что вы не включили %start parse в описании грамматики.

Второе означает, что где-то у вас есть правило, которое должно возвращать значение, но вы неправильно указали, какой тип значения он должен возвращать. PRED возвращает элемент pred вашего union; проблема может заключаться в том, что вы не создали %type записей для decline и declines. Если у вас есть союз, вы должны указать тип для большинства, если не всех, правил — или, может быть, просто правил, которые не имеют явного действия (чтобы переопределить действие по умолчанию $$ = $1;).

Я не уверен, что проблема в указанной вами строке, и поскольку у нас нет полного и минимального воспроизведения вашей проблемы, мы не можем расследовать ее, чтобы проверить ее. Спецификация для decs может быть актуальной (я не уверен, что это так, но может быть).

Вы можете получить более подробную информацию с вывода bison -v, который является файлом y.output (или что-то в этом роде).

+0

Я не могу найти примеров, которые используют метод% start parse (я не уверен, где его включить, и просто поместив его вверху, вызывает ошибку glibc), а что касается другого предупреждения, у меня есть другие правила, которые выглядят так же, как снижение и снижение, но не вызвали ошибку. – user381261

+0

Вы положили '% start' после строк'% token', возможно, хотя это необязательно, если правило начала также является первым правилом в грамматике. Но поскольку мы не можем видеть, что породило это предупреждение, мы не можем легко помочь вам решить проблему. Аналогично, с другими проблемами; вы были немного в восторге от обрезки грамматики при сохранении проблемы. С учетом вышеприведенного кода используются как «clauses», так и «decs», но «не определены как токен и не имеют правил». Добавление правил 'decs: NAME;' и 'clauses: VARIABLE;' не помогает диагностировать проблему; 'bison' компилирует грамматику без предупреждений. –