2

假设我有一个名为 1.lex 的文件。提供了一个输入文件 1.c。这个的输出是下一个输入。我希望这一次发生,因为当生成第一个输出时,内存缓冲区包含第二个输入文件所需的一些信息。

下面是针对上述情况的文件处理代码。

char * basename(char *name)
{
        char *temp;
        int i=0, j=0, len;

        temp = (char *)malloc(strlen(name));
        len = strlen(name);
        len--;
        while(1)
        {
                if(name[len] != '.')
                        len--;
                else
                {
                        for( i = 0; i < len; i++)
                                temp[j++] = name[i];
                        break;
                }
        }
        temp[j] = '\0';
        return temp;
    }





    int main(int argc, char** argv)
    {
            if(argc != 2)
            {
                    fprintf(stderr,"Usage: filename\n");
                    exit(1);
            }

            yyin = fopen(argv[1],"r");
            if(yyin == NULL)
            {
                    fprintf(stderr,"cannot open file: %s",argv[1]);
                    exit(0);
            }

            file = basename(argv[1]);
            realloc(file, strlen(file)+10);
            strcat(file,".met");
            yyout = fopen(file,"w");
            yyparse();
            return 0;
    }

    int yywrap()
    {
            fclose(yyin);
            yyin = fopen(file,"r");
            if(yyin == NULL)
            {
                    fprintf(stderr,"cannot open file: %s",file);
                    exit(0);
            }
            file = basename(file);
            realloc(file, strlen(file)+10);
            strcat(file,".meta");
            yyout = fopen(file,"w");
            yyparse(); 
            return 1;
    }

如果我在 yywrap() 函数中注释 yyparse() ,则没有分段错误,但“.meta”文件中没有写入任何内容,但第一个 o/p 文件“.met”被写入。如果我取消注释,则会出现分段错误,并且“.met”文件中没有写入任何内容。

函数“basename”是获取输入的基本名称。

函数 main() 打开第一个文件并调用 yyparse()。

当 yyparse() 处理完第一个文件后,它调用 yywrap(),打开下一个文件。

请参阅上面 yyparse() 行中的注释。

如果有其他方法可以解决我的问题,请告诉我。

谢谢。

4

2 回答 2

1

类似于最初发布的代码。我已经解释了代码之后的更改。

int main(int argc, char** argv)
{
        file_num++;
        argc = file_num_max;
        if(argc != 2)
        {
                fprintf(stderr,"Usage: filename\n");
                exit(1);
        }

        yyin = fopen(argv[1],"r");
        if(yyin == NULL)
        {
                fprintf(stderr,"cannot open file: %s",argv[1]);
                exit(0);
        }

        file = basename(argv[1]);
        realloc(file, strlen(file)+10);
        strcat(file,".met");
        yyout = fopen(file,"w");
        while(yylex())
                ;
        return 0;
}

int yywrap()
{
        fclose(yyin);
        fclose(yyout);
        yyin = fopen(file,"r");
        if(++file_num <= file_num_max)
        {
        if(yyin == NULL)
        {
                fprintf(stderr,"cannot open file: %s",file);
                exit(0);
        }
        file = basename(file);
        realloc(file, strlen(file)+10);
        strcat(file,".meta");
        yyout = fopen(file,"w");
        return 0;
        } else {
        return 1;
        }
}

如前所述,函数 main() 打开第一个文件并调用 yylex()。

当 yylex() 处理完第一个文件后,它调用 yywrap(),打开下一个文件,然后 yylex() 继续。

当 yywrap() 用尽所有命令行参数时,它返回 1 和 yylex()。

我只是做了一些小改动,它奏效了,但花了一些时间!

干杯。

于 2013-08-13T02:48:00.240 回答
1

创建一个管道并打开它进行写入并将其分配给 yyout 并打开管道进行读取并将其分配给 yyin 参见http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

于 2013-08-12T02:41:42.450 回答