C Flex:使用文本文件作为输入流
因此,我使用flex从我的lex代码生成了一个c文件,然后使用gcc创建了相应的实际parser.exe。然而,除了我自己键入的输入之外,我不知道如何让它从其他任何地方读取。我试图让它解析一个巨大的字典文件。有人能帮忙吗?你有两种解决方法。第一个是使用命令提示符C Flex:使用文本文件作为输入流,c,lex,flex-lexer,C,Lex,Flex Lexer,因此,我使用flex从我的lex代码生成了一个c文件,然后使用gcc创建了相应的实际parser.exe。然而,除了我自己键入的输入之外,我不知道如何让它从其他任何地方读取。我试图让它解析一个巨大的字典文件。有人能帮忙吗?你有两种解决方法。第一个是使用命令提示符parser.exe
parser.exe
另一种解决方案是让程序打开该文件,并告诉lexer该文件是什么。有关它的更多信息,请参阅。重要的功能是
yy_创建_缓冲区
和yy_切换到_缓冲区
尝试将以下代码添加到*.l文件中
int main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
在@Eliko的上述答案的基础上,在将flex与yacc/bison一起使用时,您可以定义
FILE*yyin
位于grammar.y文件的全局部分。生成的lex.yy.c中的定义默认为外部文件*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;
}
在UBUNTU中
将终端放置在文件夹.l文件中,然后键入以下内容:
flex nameOfFile.l
然后
那么
/a.out程序
将在短期内起作用;这就是输入重定向。您必须设置输入函数,以便它从您选择的文件中读取,而不是从标准输入中读取(对于默认源来说,这是一个合理的选择)。我需要检查一下这方面的机制…Flex和Lex中的机制是不同的。还有许多其他相关的部分,比如关于EOF处理和yywrap的部分。YY_输入宏是答案的一部分。然而,所指的手册作为一个整体来处理这个问题。在我的例子中,我将flex代码集成到我的可执行文件中,我所要做的就是添加一行yyin=fopen(我的文件,“r”),并从文件中读取flex,而无需使用yy_create_buffer或yy_switch_to_buffer。我假设只有当flex没有集成到用户可执行文件中时才需要前两个函数?我试图确保我不会天真地假设,因为在我的情况下“它工作”,它必然是“正确的”。我必须使用extern File*yyin
正好在main
函数上方。
flex nameOfFile.l
gcc lex.yy.c