首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Flex和Bison指定前缀时出现编译错误

使用Flex和Bison指定前缀时出现编译错误
EN

Stack Overflow用户
提问于 2015-09-18 20:55:31
回答 1查看 1K关注 0票数 3

我正在尝试使用给定的前缀编译一个简单的bison解析器--就像解析的in this question一样。我使用BisonVersion2.4.1和FlexVersion2.5.35(我不能使用Bison2.6)。我遇到了一个编译器错误,使我在循环中运行:

即:

代码语言:javascript
运行
复制
make
Making all in src
make[1]: Entering directory `/stage/pool14/eholum/yacc_example/src'
/bin/sh ../ylwrap parcalc.y y.tab.c parcalc.c y.tab.h parcalc.h y.output parcalc.output -- bison -y  -d -p="calcYY"
...yacc_example/src/parcalc.y:27.7-13: warning: type clash on default action: <result> != <>
conflicts: 4 shift/reduce
updating parcalc.h
gcc -DPACKAGE_NAME=\"calculator\" -DPACKAGE_TARNAME=\"calculator\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"calculator\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"calculator\" -DVERSION=\"1.0\" -I.     -g -O2 -MT parcalc.o -MD -MP -MF .deps/parcalc.Tpo -c -o parcalc.o parcalc.c
parcalc.c:1053: error: expected identifier or ‘(’ before ‘=’ token
parcalc.c:1061: error: expected identifier or ‘(’ before ‘=’ token
parcalc.c:1064: error: expected identifier or ‘(’ before ‘=’ token
parcalc.c:1067: error: expected identifier or ‘(’ before ‘=’ token
parcalc.c:1089: error: expected identifier or ‘(’ before ‘=’ token
parcalc.y:75:21: error: lexcalc.c: No such file or directory
make[1]: *** [parcalc.o] Error 1

我目前正在使用自动生成,但是如果我使用flex和bison构建,然后尝试使用c进行编译,则会遇到同样的错误。

代码语言:javascript
运行
复制
bin_PROGRAMS = calculator
AM_YFLAGS = -d -p="calcYY"
calculator_SOURCES = parcalc.y lexcalc.l

如果lex代码在lexalc.l中(注意,我使用%选项来指定前缀,但使用cl标志时会得到相同的错误):

代码语言:javascript
运行
复制
%{
#include <stdio.h>
#include "parcalc.h"
%}

%option noyywrap
%option prefix="yy"

%%

[ \t] ; 

[0-9]+\.[0-9]+ { 
    yylval.flval = atof(yytext);
    return FLOAT;
}

[0-9]+ {
    yylval.inval = atoi(yytext);
    return INT;
}

- { return MINUS; }

\+ { return PLUS; }

\n {
    yylineno++; 
    return NEWLINE; 
}

. ;

%%

野牛的代码用parcalc.y表示:

代码语言:javascript
运行
复制
%{
#include <stdio.h>
%}

%token INT FLOAT PLUS MINUS NEWLINE;

%union {
    int inval;
    float flval;
    char oper;
    char result[100];
}

%type <inval> INT;
%type <flval> calc FLOAT
%type <oper> PLUS MINUS;
%type <result> line;

%%

lines:
     line lines
    | line
    ;

line:
      NEWLINE
    | calc NEWLINE {
        printf("Result = %f\n", $1);   
      }
    ;

calc :
      calc PLUS calc { 
        ($$ = $1 + $3);
      }
    | calc MINUS calc { 
        ($$ = $1 - $3); 
      }
    | INT { 
        ($$ = $1);
      }
    | FLOAT { 
        ($$ = $1); 
      }
    ;

%%

extern int calcYYparse();
extern FILE *calcYYin;

int main() {

    FILE *myfile = fopen("infile.txt", "r");

    if (!myfile) {
        fprintf(stderr, "can't open infile.txt\n");
        return 1;
    }

    calcYYin = myfile;

    do {
        calcYYparse();
    } while (!feof(calcYYin));

    return 0;
}

void calcYYerror(const char *s) {
    fprintf(stderr, "Unrecognized format\n");
}

我应该注意到,当我放弃前缀时,一切似乎都很好,所以我猜想,在生成的c文件中,事情是如何对外声明的,这是有问题的。看看那些我还没弄清楚的东西。如果有人与多个解析器混在一起,并且对如何使这些东西在一起很好地发挥作用有了一些见解,我会非常感激的。

EN

Stack Overflow用户

回答已采纳

发布于 2015-09-18 22:50:59

感谢Michael发现了将前缀标志传递给bison编译器的问题。即

代码语言:javascript
运行
复制
AM_YFLAGS = -d -p="calcYY"

对比

代码语言:javascript
运行
复制
AM_YFLAGS = -d -p"calcYY"

此外,前缀只会改变yyparse、yylex、yyerror、yynerrs、yylval、yylloc、yychar和y调试。所以银印不需要改变。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32660889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档