gpt4 book ai didi

c - yyin 不读取文本文件中的所有数据

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:42 25 4
gpt4 key购买 nike

我从这个问题中遇到了一个新问题: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];

%%

计算量

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

ma​​in.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);
}

测试.txt

2+1
5+1
1+3

我的代码是这样工作的:

  1. 我创建了 main.c 来打开一个文件并读取它,然后调用一个带有参数 fileInput 的函数 parse()。
  2. 在 calc.y 中,我将指针 yyin 设置为与 fileInput 相同,以便解析器可以循环读取文本文件 (test.txt) 中的所有行

问题是 yyin 没有阅读文本中的所有行。我得到的结果是

= 3

我应该得到的结果是

= 3
= 6
= 4

我该如何解决这个问题。请注意,我希望 main.c 保留。

最佳答案

这与yyin无关。您的问题是您的语法 无法识别一系列语句;它只识别一个。在解析了文件的第一行并最终将其缩减为一个语句之后,解析器就无能为力了。它无法将以语句 开头的一系列符号简化为其他任何内容。由于当解析器阻塞时仍有输入剩余,它会向其调用者返回一个错误代码,但调用者会忽略它。

要使解析器能够处理多个语句,您需要一个规则。大概您希望生成的符号成为开始符号,而不是语句。这是一个合理的规则:

statements: statement
| statements statement
;

关于c - yyin 不读取文本文件中的所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41004571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com