【发布时间】:2016-12-06 20:46:53
【问题描述】:
我从问题中遇到了一个新问题:Call a function in a Yacc file from another c file 所以这次我遇到了 Lex 和 Yacc 中的 yyin 函数的问题。我的代码如下:
calc.l
%{
#include "y.tab.h"
extern int yylval;
%}
%%
[0-9]+ { yylval=atoi(yytext); return NUMBER;}
[ \t];
\n return 0;
. return yytext[0];
%%
calc.y
%{
#include <stdio.h>
#include <string.h>
extern FILE* yyin;
%}
%token NAME NUMBER
%%
statement: NAME '=' expression
| expression {printf("= %d\n",$1);}
;
expression: NUMBER '+' NUMBER {$$=$1+$3;}
| NUMBER '-' NUMBER {$$=$1-$3;}
| NUMBER 'x' NUMBER {$$=$1*$3;}
| NUMBER '/' NUMBER
{ if($3 == 0)
yyerror("Error, cannot divided by zero");
else
$$=$1/$3;
}
| NUMBER {$$=$1;}
;
%%
void parse(FILE* fileInput)
{
yyin= fileInput;
while(feof(yyin)==0)
{
yyparse();
}
}
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{
FILE* fileInput;
char inputBuffer[36];
char lineData[36];
if((fileInput=fopen(argv[1],"r"))==NULL)
{
printf("Error reading files, the program terminates immediately\n");
exit(0);
}
parse(fileInput);
}
test.txt
2+1
5+1
1+3
这就是我的代码的工作方式:
- 我创建了 main.c 来打开一个文件并读取它,然后使用参数 fileInput 调用一个函数 parse()。
- 在 calc.y 中,我将指针 yyin 设置为与 fileInput 相同,以便解析器可以循环并读取文本文件 (test.txt) 中的所有行
问题是 yyin 没有读完文本中的所有行。我得到的结果是
= 3
我应该得到的结果是
= 3
= 6
= 4
我该如何解决这个问题。请注意,我希望 main.c 保留。
【问题讨论】:
-
exit(0)表示您的程序已成功完成。你确定你对exit()在这里打电话if((fileInput=fopen(argv[1],"r"))==NULL) { printf("Error reading files, the program terminates immediately\n"); exit(0); }吗?