Диагностика
Я установил Bison 3.0.4-1 через HomeBrew (https://brew.sh/),, и когда я запускаю его в вашем коде, я не получаю предупреждений или ошибок. Когда я использую /usr/bin/bison
(предоставляемый Apple Bison 2.3), я получаю:
so-5022-1650.y:13.13-23: syntax error, unexpected identifier, expecting string.
Я диагностирую, что вы случайно используете предоставленный системой Bison, а не Bison 3.0.4 от Brew (или откуда вы его получили). Проверьте настройки PATH.
Я добавил однострочный комментарий перед вашим кодом, поэтому моя строка 13 соответствует вашей строке 12, то есть строке %define
. Когда я изменил это, чтобы прочитать
%define "parse.error" "verbose"
Зубр 2.3 скомпилировал код без ошибок. Это может даже работать, поэтому. Когда я компилирую эту более старую запись с Bison 3.0.4, я получаю предупреждение:
so-5022-1650.y:13.13-25: warning: %define variable 'parse.error' requires keyword values [-Wdeprecated]
%define "parse.error" "verbose"
^^^^^^^^^^^^^
Существует директива %error-verbose
, которая номинально устарела, но все еще пригодна для использования. Официально его заменили на %define parse.error verbose
в 3.0.x. Однако использование %error-verbose
работает без предупреждения как с Bison 2.3, так и с Bison 3.0.4.
Шаги к ответу
Что вы ожидаете от %define parse.error verbose
?
Зубр на Mac довольно старый - bison (GNU Bison) 2.3
. В пределах семейства 2.x были версии до 2.7.1, а текущая версия 3.0.4.
В документации Bison 3.0.4 по %define
отмечается, что:
Существует множество особенностей поведения Bison, которыми можно управлять, присваивая этой функции одно значение. По историческим причинам некоторым таким функциям присваиваются значения с помощью специальных директив, таких как %start
, который назначает начальный символ. Однако такие новые функции связаны с переменными, которые назначаются директивой %define
:
и продолжает обсуждать, кто они.
Если вам удастся найти документацию по Bison 2.3, %define
не является ее частью. (Например, моя электронная книга О'Рейли «Flex and Bison» не охватывает ее - она описывает Bison 2.4.1 и Flex 2.5.35.)
Итак, вы, вероятно, приложите все усилия, чтобы заполучить Bison 3.0.4, скомпилировать и установить его (или загрузить его предварительно с одного из сайтов загрузки Mac). В качестве альтернативы вам придется пересмотреть код для работы со старыми версиями Bison, что будет означать, что вы не используете %define
.
Изучая НОВОСТИ для Bison 2.3, кажется, что некоторые опции %define
могли быть поддержаны; они были «новыми в 2.2», или, по крайней мере, в примечаниях для 2.2 упоминается %define "global_tokens_and_yystype" "1"
как возможность. Это синтаксис отличается от того, что вы используете. Глядя на файл Bison 3.0.4 NEWS, кажется, что parse.error
был добавлен в Bison 3.0 (не в Bison 2.7) - вот почему у вас возникли проблемы с Bison 2.3. Для этого в файле NEWS используется нотация без кавычек.