Bison-Flex extern FILE *yyin 不工作(C 语言)

cap*_*onk 5 c parsing bison lexical-analysis flex-lexer

我知道在 flex 中你只需要yyin = fopen(filename, "r");读取一个文件,但是如果你想从 bison 中读取它怎么可能呢?我正在尝试将 flex 和 bison 结合使用(读取文件4 + 5 + 7;并打印结果),但我很难尝试从 bison 打开文件。我试图extern FILE *yyin在申报室使用,然后yyin = fopen(filename, "r");我得到了错误:

C2065:'yyin':未声明的标识符。

这是我的代码,以防万一它有助于找到它。

野牛代码:

%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern FILE *yyin;
int yyerror(char *message)
{
    return 0;
}
%}

%union {
 double val;
 char sym;
}   
%token <val> NUMBER
%token <sym> PLUS Q_MARK
%type <val> addition_list addition
%start addition_list
%%

addition_list : addition Q_MARK  {printf("apotelesma: %d\n", $1);}
| addition_list addition Q_MARK  {}
;

addition : NUMBER PLUS NUMBER {$$ = $1 + $3;}
| addition PLUS NUMBER {$$ = $1 + $3;}
;

%%
void main(int argc, char *argv[])
{
    yyin = fopen("argv[1]", "r");
    yyparse();
}
Run Code Online (Sandbox Code Playgroud)

弹性代码:

%option noyywrap
%{
#include "flex2.tab.h"
%}

%%
\+ { flex2lval.sym = yytext[0];printf("%c\n", yytext[0]);  return PLUS; }
; { flex2lval.sym = yytext[0]; return Q_MARK; }
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) {flex2lval.val = atof(yytext); return NUMBER; }
%%
Run Code Online (Sandbox Code Playgroud)