gpt4 book ai didi

c - flex bison 和 yyparse 的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:10 25 4
gpt4 key购买 nike

我正在尝试实现 flex 和 bison,但此循环返回了核心转储的段错误第一个文件工作正常,但下一个文件崩溃并打印成终端段错误。

DIR *dir;
struct dirent *ent;

if ((dir = opendir ("./Corpus")) != NULL)
{
while ((ent = readdir (dir)) != NULL)
{
if ((strcmp(ent->d_name,".") != 0) && (strcmp(ent->d_name,"..") != 0))
{
printf("%s\n",ent->d_name);
yyin = fopen(ent->d_name,"r");
yyparse();


}

}

closedir (dir);
}
else
{
// could not open directory
perror ("");
return EXIT_FAILURE;
}

最佳答案

如果您使用的是 flex 的较新版本,以您的方式切换输入文件没有任何问题。但是,如果不查看更多代码,就无法确定问题出在哪里。

一个明显的问题是您在调用fopen 之后没有检查yyin 的值。如果打开失败(这很可能,见下文),那么 yyin 将是 NULL 并且当 flex 尝试打开时肯定会产生段错误阅读。

此外,您似乎没有关闭 yyin,这会泄漏文件描述符。这在第二个文件上应该不是问题,但它最终会由于缺少文件描述符而导致打开失败。

fopen 的问题是 ent->d_name 只是文件的基本名称,没有任何路径。所以 fopen 将在当前工作目录中搜索文件。但是读取的目录是./Corpus,这是一个子目录;除非该文件在 Corpus 和主目录之间重复,否则将找不到该文件。

为了评论员的利益,Flex manual状态:

If the scanner reaches an end-of-file, subsequent calls are undefined unless either yyin is pointed at a new input file (in which case scanning continues from that file)… Essentially there is no difference between just assigning yyin to a new input file or using yyrestart() to do so; the latter is available for compatibility with previous versions of flex, and because it can be used to switch input files in the middle of scanning.

段错误也可能与文件处理无关。最好使用调试器来确定段错误发生的确切位置。

关于c - flex bison 和 yyparse 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com