是否可以在bison.y.h文件中公开yyin?

问题描述 投票:0回答:1

我正在使用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的输入?

c bison flex-lexer yacc
1个回答
0
投票

首先,要设置的yyin由Flex生成的扫描仪声明和定义。在bison生成的解析器中声明不同的变量将产生链接器错误,因为只能有一个具有给定名称的外部全局变量。因此,您的野牛文件应将其声明为extern

但是您不想导出该声明;您要导出的唯一声明是set_file函数的声明。为了使野牛将声明插入头文件中,需要将声明放入%code provides块中。

将所有内容放在一起,您将得到:

%code provides
© www.soinside.com 2019 - 2024. All rights reserved.