Ошибка синтаксиса бизонов mac - PullRequest
0 голосов
/ 07 мая 2018

Я использую Bison на Mac и, похоже, получаю сообщение об ошибке ниже.Я не могу решить эту проблему.Любая идея о том, почему я получаю синтаксическую ошибку из кода, показанного ниже?

Вывод терминала при запуске:

синтаксическая ошибка, неожиданный идентификатор, ожидаемая строка bison -d parser.y

parser.y

 %{
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #define YYDEBUG 1
    extern FILE * yyin;
    FILE * outputFile;
    int yyerror(const char* s);
    int yylex(void);
    %}

    %define parse.error verbose
    %token PROGRAM BEGIN_WORD END VAR PRINT INTEGER STRING NUM ID

    %%
    start       : PROGRAM pname ';' VAR decList ';' BEGIN_WORD statList END { YYACCEPT; }
                ;
    pname       : ID { fprintf(outputFile, "#include <iostream>\nUsing namespace std;\nint main()\n{\n"); }
                ;
    decList     : dec ':' type
                ;
    dec         : ID ',' dec
                | ID
                ;
    statList    : stat ';'
                | stat ';' statList
                ;
    stat        : print
                | assign
                ;
    print       : PRINT '(' output ')' 
                ;
    output      : STRING ',' ID         
                | ID                        
                ;
    assign      : ID '=' expr
                ;
    expr        : term                      
                | expr '+' term             
                | expr '-' term             
                ;
    term        : term '*' factor           
                | term '/' factor           
                | factor
                ;
    factor      : ID
                | NUM
                | '(' expr ')'      
                ;
    type        : INTEGER
                ;
    %%

    int main (void) 
        {
        yyin=fopen("input.txt","r+");
        if(yyin==NULL)
        {
            return(printf("error: failed to open file\n"));
        }
        else 
        {
        outputFile = fopen("abc13.cpp","w");
            return(yyparse());
        }
        return 0;
        }

    int yyerror(const char * s) 
        { 
        return(fprintf(stderr, "%s\n", s)); 
        }

Не уверен, что проблема в версии Bison, которую я имею, или в том, что я на Mac.

Версия:

Бизон 3.0.4_1

1 Ответ

0 голосов
/ 08 мая 2018

Диагностика

Я установил 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 используется нотация без кавычек.

...