所以我使用flex从我的lex代码生成一个c文件,然后使用gcc创建相应的实际解析器.exe。但是,我无法弄清楚如何让它从我自己输入的输入之外读取。我试图让它解析一个巨大的字典文件。有人可以帮忙吗?
答案 0 :(得分:7)
尝试将以下代码添加到* .l文件中。
int main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
答案 1 :(得分:5)
你有两种解决方法。第一种是使用命令提示符<
操作重定向标准输入的输入:
> parser.exe < some_file.txt
另一个解决方案是让程序打开文件,告诉词法分析器文件是什么。有关它的更多信息,请参阅the Flex manual。重要的功能是yy_create_buffer
和yy_switch_to_buffer
。
答案 2 :(得分:3)
在@Eliko上添加上述答案,在使用flex与yacc / bison时,您可以在grammar.y文件的全局部分中定义FILE *yyin;
。生成的lex.yy.c中的定义默认为extern FILE *yyin
。因此,在grammar.y
中,执行以下操作:
/* Some other global definitions */
FILE *yyin;
%%
/* Grammar rules*/
/* Grammar rules*/
%%
void main(int argc, char **argv) {
/* Process command line args*/
yyin = fopen("input.c", "r");
yyparse();
fclose(yyin);
return 0;
}
答案 3 :(得分:0)
在 UBUNTU 中 将终端放在 .l 文件所在的文件夹中,然后键入以下内容:
flex nameOfFile.l
然后
gcc lex.yy.c
然后./a.out <nameOfFileYouWantToPass.extension
(例如./a.out <test.txt
)
.l 文件和 test.txt 应该位于同一文件夹中