C Flex:使用文本文件作为输入流

C Flex:使用文本文件作为输入流,c,lex,flex-lexer,C,Lex,Flex Lexer,因此,我使用flex从我的lex代码生成了一个c文件,然后使用gcc创建了相应的实际parser.exe。然而,除了我自己键入的输入之外,我不知道如何让它从其他任何地方读取。我试图让它解析一个巨大的字典文件。有人能帮忙吗?你有两种解决方法。第一个是使用命令提示符parser.exe

因此,我使用flex从我的lex代码生成了一个c文件,然后使用gcc创建了相应的实际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