我正在尝试使用Flex&Bison制作文件解析器。我不想在yacc文件(联合)中使用结构指针,也无法构建它。

在我的yacc文件eddl.y中

%{

#include <stdio.h>     /* C declarations used in actions */
#include <stdlib.h>
#include <string.h>

#include "eddl_data_type.h"

int yylex(void);
void yyerror (char *s);
%}

%union {
        float dec;
        char* ptr;
        int num;
        char str[100];
        eddl_variable_t* var;     //<----- Troublemaker
        }

%%

... grammar

%%      /* C code */
#include <stdio.h>
#include <string.h>

#include "eddl_data_type.h"

int main(void) {return yyparse();}

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


在eddl_data_type.h中

typedef struct eddl_variable eddl_variable_t;

struct eddl_variable{
    char*           __name;
    char*           __label;
    char*           __help;
    class_mask_t    __class;
    type_mask_t     __type;
    void*           __default_value;
    handling_mask_t __handling;

    eddl_variable_t* next;
};


我正在使用以下Makefile

scanner: lex.yy.c y.tab.c
        gcc -g lex.yy.c y.tab.c -o scanner

lex.yy.c: y.tab.c eddl.lex
        lex eddl.lex

y.tab.c: eddl.y
       yacc -d eddl.y

clean:
        rm -f lex.yy.c y.tab.c y.tab.h scanner


我的构建输出是


  yacc -d eddl.y
  lex eddl.lex
  gcc -g lex.yy.c y.tab.c -o扫描仪
  在eddl.lex包含的文件中:2:0:
  eddl.y:17:9:错误:未知类型名称‘eddl_variable_t’
           eddl_variable_t * var;
           ^ ~~~~~~~~~~~~~~


yacc联合中是否可以有这种数据类型?如果是这样,我一直无法找出如何做到这一点。

提前谢谢了。

最佳答案

我发现了问题。 yacc文件中指定的并集属性将编译到y.tab.h中。我没有意识到我的错误源于我的lex文件,因为我包含了y.tab.h文件,但没有包含eddl_data_type.h文件。确保在y.tab.h解决此问题之前将其包括在内。

我的eddl.l文件的顶部如下

%{
#include "eddl_data_type.h"
#include "y.tab.h"

关于c - 使用结构指针作为 union 类型时,Flex和Bison出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47610269/

10-11 21:34