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

时间:2013-02-02 20:08:10

标签: c lex flex-lexer

所以我使用flex从我的lex代码生成一个c文件,然后使用gcc创建相应的实际解析器.exe。但是,我无法弄清楚如何让它从我自己输入的输入之外读取。我试图让它解析一个巨大的字典文件。有人可以帮忙吗?

4 个答案:

答案 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_bufferyy_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 应该位于同一文件夹中