Bison-Flex外部文件 *yyin不工作(C语言)

ykejflvf  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(139)

我知道,在flex中,您只需执行yyin = fopen(filename, "r");即可读取文件,但如果您想从野牛中执行此操作,那怎么可能呢?我正尝试将flex和bison结合起来,以达到我的目的(用4 + 5 + 7;读取一个文件并打印结果)但是我很难尝试从野牛打开一个文件。我尝试在申报室使用extern FILE *yyin,之后又尝试使用yyin = fopen(filename, "r");,但出现错误:
C2065:“一因”:未声明的标识符。
这是我的代码,以防万一它有助于找到它。
野牛代码:

%{
#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();
}

弹性代码:

%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; }
%%
5sxhfpxr

5sxhfpxr1#

flex生成的文件和野牛生成的文件沿着编译了吗?
flex lexical_file.l(生成lex.yy.c)
bison -d syntax_file.y(生成语法文件选项卡c和语法文件选项卡h)

gcc syntax_file.tab.c lex.yy.c -lfl -o myparser.out

此外,您还应该删除“argv[1]"周围的引号。如果您希望成功打开作为第一个参数传递给解析器的文件,而不是尝试打开实际上名为**“argv[1]"的文件,则它应该是yyin = fopen(argv[1], "r");

相关问题