gpt4 book ai didi

include - Bison/Flex 声明困惑......我应该如何在哪里包含/声明什么?

转载 作者:行者123 更新时间:2023-12-04 12:24:14 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com