我知道在flex中你只需要yyin = fopen(filename, "r");
来读取文件,但如果你想从野牛那里做到这一点怎么可能?我正在尝试将flex和bison结合起来用于我的目的(使用4 + 5 + 7;
读取文件并打印结果)但我很难尝试从野牛打开文件。我试图在宣言室使用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();
}
flex代码:
%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; }
%%
答案 0 :(得分:2)
您是否编译了与生成的文件bison一起生成的flex文件?
flex lexical_file.l
(生成lex.yy.c)
bison -d syntax_file.y
(生成syntax_file.tab.c和syntax_file.tab.h)
gcc syntax_file.tab.c lex.yy.c -lfl -o myparser.out
此外,你应该删除&#34; argv [1]&#34;周围的引号。如果要成功打开作为解析器的第一个参数传递的文件,而不是尝试打开实际上命名&#34; argv [的文件,那么它应该是yyin = fopen(argv[1], "r");
1]&#34;