bison与flex联合编译时,我不想从stdin输入了,我想让bison读取文件怎么做
时间: 2024-03-20 08:44:14 浏览: 17
如果你想让bison从文件中读取输入而不是从stdin中读取输入,你可以在程序中打开一个文件,然后将文件的描述符传递给flex和bison。具体步骤如下:
1. 在程序中打开文件,获取文件的描述符:
```
FILE *fp = fopen("input.txt", "r");
if (!fp) {
printf("Failed to open input file\n");
exit(1);
}
```
2. 将文件的描述符传递给flex,让它从文件中读取输入。在flex的扫描器中,你可以使用yyin变量指定输入流。为了让flex从文件中读取输入,你可以使用fsetpos或fseek函数将文件指针移动到文件的起始位置,然后将文件指针传递给yyin变量:
```
fsetpos(fp, &pos); // 将文件指针移动到起始位置
yyin = fp; // 将文件指针传递给yyin变量
```
或者直接使用fseek函数:
```
fseek(fp, 0, SEEK_SET); // 将文件指针移动到起始位置
yyin = fp; // 将文件指针传递给yyin变量
```
3. 将文件的描述符传递给bison,让它从文件中读取输入。你可以使用yyrestart函数重新启动bison的解析器并指定输入流。同样地,在bison的语法文件中,你也需要使用%option noyywrap来禁用默认的yywrap函数,防止它在文件末尾自动关闭输入流:
```
%option noyywrap
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token INTEGER
%%
input: /* empty */
| input line
;
line : INTEGER '\n' { printf("Read integer: %d\n", $1); }
;
%%
int main(int argc, char *argv[]) {
FILE *fp = fopen("input.txt", "r");
if (!fp) {
printf("Failed to open input file\n");
exit(1);
}
// 将文件的描述符传递给flex
fsetpos(fp, &pos);
yyin = fp;
// 将文件的描述符传递给bison
yyrestart(fp);
yyparse();
fclose(fp);
return 0;
}
```
这样,bison就可以从文件中读取输入了。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)