Flex & Bison 在将结构指针用作联合类型时会出现问题
Flex & Bison make problems when using struct pointers as a union type
我正在尝试使用 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 scanner
In file included from eddl.lex:2:0:
eddl.y:17:9: error: unknown type name ‘eddl_variable_t’
eddl_variable_t* var;
^~~~~~~~~~~~~~~
在yacc union中可以有这样的数据类型吗?如果是这样,我一直无法找出如何做到这一点。
非常感谢。
我找到问题了。 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"
我正在尝试使用 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 scanner
In file included from eddl.lex:2:0:
eddl.y:17:9: error: unknown type name ‘eddl_variable_t’
eddl_variable_t* var;
^~~~~~~~~~~~~~~
在yacc union中可以有这样的数据类型吗?如果是这样,我一直无法找出如何做到这一点。
非常感谢。
我找到问题了。 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"