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

Joh*_*rts 5 c lex flex-lexer

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

Eli*_*iko 7

尝试将以下代码添加到*.l文件中.

int main(int argc, char *argv[])
{
    yyin = fopen(argv[1], "r");
    yylex();
    fclose(yyin);
}
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 6

你有两种解决方法.第一种是使用命令提示<操作重定向标准输入的输入:

> parser.exe < some_file.txt
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是让程序打开文件,并告诉词法分析器文件是什么.有关它的更多信息,请参阅Flex手册.重要的功能是yy_create_bufferyy_switch_to_buffer.


for*_*tor 5

将@Eliko添加到上述答案中,同时将yacc / bison与flex一起使用时,可以FILE *yyin;在grammar.y文件的全局部分中进行定义。extern FILE *yyin默认情况下,生成的lex.yy.c中的定义是。因此,在您的中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;
}
Run Code Online (Sandbox Code Playgroud)