野牛语法错误mac

时间:2018-05-07 20:04:31

标签: c bison flex-lexer yacc lex

我在Mac上使用Bison,我似乎得到了下面的错误。我似乎无法解决这个问题。知道为什么我从下面显示的代码中得到语法错误?

运行时的终端输出:

  

语法错误,意外标识符,期望字符串   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上。

版本:

  

bison 3.0.4_1

1 个答案:

答案 0 :(得分:3)

诊断

我已经通过HomeBrew(https://brew.sh/)安装了Bison 3.0.4-1,当我在您的代码上运行时,我没有收到任何警告或错误。当我使用/usr/bin/bison(Apple提供的Bison 2.3)时,我得到:

so-5022-1650.y:13.13-23: syntax error, unexpected identifier, expecting string.

我诊断你是在意外地使用系统提供的Bison而不是Brew中的Bison 3.0.4(或者你从哪里获得它)。检查您的PATH设置。

我在您的代码前添加了一行注释,因此我的第13行对应您的第12行,即%define行。当我把它改为阅读时

%define "parse.error" "verbose"

Bison 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指令,但它仍然可用。正式地说,它在3.0.x中被%define parse.error verbose取代。但是,使用%error-verbose可以在没有Bison 2.3和Bison 3.0.4的情况下发出警告。

迈向答案的步骤

您希望%define parse.error verbose做什么?

Mac上的Bison相当陈旧 - bison (GNU Bison) 2.3。 2.x系列中有版本高达2.7.1,当前版本为3.0.4。

%define的Bison 3.0.4文档中,它注意到:

  

可以通过为要素指定单个值来控制Bison行为的许多功能。由于历史原因,某些此类功能由专用指令分配值,例如%start,用于指定起始符号。但是,较新的此类功能与变量相关联,这些变量由%define指令分配:

并继续讨论它们是什么。

如果您设法找到Bison 2.3文档,%define不属于它。 (我的O&#39; Reilly电子书&#34; Flex和Bison&#34;例如,它没有涵盖它 - 它描述了Bison 2.4.1和Flex 2.5.35。)

因此,您可能最好抓住Bison 3.0.4并进行编译和安装(或者从Mac下载站点下载,预先构建)。或者,您需要修改代码以使用旧版本的Bison,这意味着不使用%define

围绕BIS新闻报道2.3,看来可能已经支持了一些%define个选项;它们是2.2&#39;中的新内容,或至少2.2提及%define "global_tokens_and_yystype" "1"的注释可能性。这与您使用的语法不同。看看Bison 3.0.4 NEWS文件,似乎在Bison 3.0中添加了parse.error(不是在Bison 2.7中) - 这就是为什么你在Bison 2.3中遇到麻烦的原因。 NEWS文件也使用无引号表示法。