我正在使用flex和bison构建编译器,但是我需要将入口点保存在其他文件中。这给我带来了问题,因为我假装解析文件。
野牛文件看起来像这样:
%{
void set_file ( const char *file_path );
FILE *yyin;
%}
%%
// Boring stuff
%%
void set_file ( const char *file_path )
{
yyin = fopen(file_path, "r");
}
与此同时,'main.c'文件看起来像这样:
#include "nml.y.h"
#include <stdio.h>
int main ( int argc, char *argv[] )
{
for (int i = 1; i < argc; i++) {
set_file(argv[i]);
yyparse();
}
return 0;
}
问题是,yyin和set_file()都没有在生成的bison.tab.h文件中公开,因为它们仅是源文件的一部分,从而导致编译器警告,并且看似很糟糕的编程练习。
是否可以通过其他文件设置yylexer的输入?
首先,要设置的yyin
由Flex生成的扫描仪声明和定义。在bison生成的解析器中声明不同的变量将产生链接器错误,因为只能有一个具有给定名称的外部全局变量。因此,您的野牛文件应将其声明为extern
。
但是您不想导出该声明;您要导出的唯一声明是set_file
函数的声明。为了使野牛将声明插入头文件中,需要将声明放入%code provides
块中。
将所有内容放在一起,您将得到:
%code provides