我正在使用 Bison 和 Flex 来制作一个可重入扫描器/解析器对,但无法将我的头脑围绕在要包含和声明所有内容的地方。
首先,我使用的是可重入 Flex,所以我需要通过 yyscan_t
首先通过声明 %parse-param {yyscan_t scanner}
向 Bison 键入扫描仪类型然后通过声明 %lex-param {yyscan_t scanner}
让 Bison 将其传递给 Flex .但是yyscan_t
Bison 没有声明,所以我必须在我的 Bison 文件中包含 Flex 生成的扫描仪头文件(我将其命名为scanner.flex.h)。但是由于我的 Flex 文件包含了我的 Bison header ,而我的 Bison header 现在包含了 Flex header ,所以我得到了循环包含,它以不可预知的方式弄乱了东西!
假设我想用 %locations
添加位置跟踪在我的 Bison 文件和 %bison-locations
在我的 Flex 文件中。现在我需要更改我的 yyerror 和 yylex 的声明(似乎我必须再次定义 yylex,即使它是在 Flex 生成的 header 中定义的,但我不能包含它,记得吗?)函数在我的 Bison 文件中包含 YYLTYPE 指针.但是现在呢?似乎默认的 YYLTYPE 声明是在插入序言之后放置的,因此我不能在我的 yyerror 和我的 yylex 的声明中使用这个默认的 YYLTYPE。
我意识到这些问题有很多解决方法......但是你应该如何正确地做到这一点?它完全逃脱了我,这只让我的头一团糟......
最佳答案
在您的 Bison 文件的顶部,您需要转发声明这些值。在包含 flex 和 bison 文件之前,您可以在公共(public)头文件或代码文件中执行此操作。 yyscan_t
只是 void * 的 typedef,所以我将参数声明为 void 指针以使其工作。
CommonHeader.h
int yylex (union YYSTYPE * yyval_param, struct YYLTYPE * yylloc_param, void * yyscanner);
int yyerror(struct YYLTYPE * yylloc_param, void *scanner, const char *s);
yyerror 示例
int yyerror(struct YYLTYPE * yylloc_param, void *scanner, const char *s)
{
printf("*** Lexical Error %s %d.%d-%d.%d\n", s,
yylloc_param->first_line, yylloc_param->first_column,
yylloc_param->last_line, yylloc_param->last_column);
}
关于include - Bison/Flex 声明困惑......我应该如何在哪里包含/声明什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612371/