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

标签 include bison flex-lexer

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

相关文章:

php include 来自 fifo(命名管道)文件的指令

c++ - 如何在我的 "include path"中放入一些东西?

c - 运行生成的 YACC 解析器产生意外的语法错误

parsing - 使用 prolog 构建解析树

c - 为 bison 进行 Flex 换行扫描

php - 使用 php include 的更好/更安全的方法?

c++ - 如何找到包含文件的 'namespace keyword'?

c - 在 Bison 中出现错误没有声明类型

计数 C 指令

c++ - Bison,在 C++ 中与 flex 交互