Что делает флаг -y / -yacc в зубре? - PullRequest
3 голосов
/ 11 февраля 2011

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

Кто-нибудь имеет ссылку на то, что он на самом деле делает или почему он не скомпилирует мой код?

   -y, --yacc
          emulate POSIX Yacc

1 Ответ

3 голосов
/ 11 февраля 2011

По умолчанию Bison генерирует один набор имен файлов, но POSIX требует другого набора имен файлов. Флаг -y заставляет Bison генерировать имена POSIX вместо своего собственного набора имен.

Для имени входного файла grammar.y Bison обычно выдает grammar.tab.cgrammar.tab.h, если вы запрашиваете заголовок). С флагом -y Bison производит y.tab.c и y.tab.h.

Обратите внимание, что флаг -y должен влиять только на имена выходных файлов. Это не должно влиять ни на то, что приемлемо в качестве грамматики, ни на число конфликтов.

Интересно, что на одной и той же грамматике результат немного отличается; в строках действий есть пустой оператор:

$ diff y.tab.c grammar.tab.c
558c558
< #line 559 "y.tab.c"
---
> #line 559 "grammar.tab.c"
2828c2828
<     { stmt_type = STMT_NONE; }
---
>     { stmt_type = STMT_NONE; ;}
2833c2833
<     { stmt_type = STMT_LOAD; }
---
>     { stmt_type = STMT_LOAD; ;}
...
...