8

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

4

4 回答 4

13

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

> parser.exe < some_file.txt

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

于 2013-02-02T20:22:23.813 回答
11

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

int main(int argc, char *argv[])
{
    yyin = fopen(argv[1], "r");
    yylex();
    fclose(yyin);
}
于 2013-10-29T12:34:48.903 回答
9

在@Eliko 的上述答案中添加,在将 flex 与 yacc/bison 一起使用时,您可以FILE *yyin;在 Grammar.y 文件的全局部分中进行定义。生成的 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;
}
于 2017-04-25T04:16:01.793 回答
0

.l文件所在文件夹中的UBUNTU Position 终端中,然后键入以下内容:

flex nameOfFile.l

然后

gcc lex.yy.c

然后./a.out <nameOfFileYouWantToPass.extension(例如./a.out <test.txt

.l文件和test.txt应该在同一个文件夹中

于 2020-05-28T21:48:07.523 回答