【问题标题】:Problems about yyin and yyout using in lex for lexical analysis关于在 lex 中使用 yyin 和 yyout 进行词法分析的问题
【发布时间】:2020-11-10 06:15:15
【问题描述】:

这是词法分析的主要功能。

如果我使用yyin 从文件中获取数据,yyout 执行并写入文件,但是当我从终端提供代码时 yyout 不起作用。我该如何解决?

int main(int argc, char *argv[])
{

extern FILE *yyin, *yyout; 
    char *input;
    printf("flexing there\n argc=%d\n argv[0]=%s argv[1]=%s \n",argc,argv[0],argv[1]);
    if(argc > 1 && strstr(argv[1],".g++") != NULL){
    printf("we will read your file = %s\n",argv[1]);
    
    yyin = fopen(argv[1], "r"); 
  
  
    }
    else if(argc > 1){
        printf("your file type is wrong ,must be .g++ type\n");
        return 0;
    }
    else{
        printf("enter your code please\n ");
    }
    yyout = fopen("outputlex.txt", "w"); 
    yylex();
    
    
    
   return 0;

}

我在这样的规则部分使用 yyout

%%

"("         fprintf(yyout,"OP_OP\n");

%%

【问题讨论】:

  • 请提供一些“yyout 不起作用”的证据。你甚至在哪里使用yyout?你如何测试?你得到了什么结果,你期望什么?请参阅How to Ask,尤其是如何创建minimal reproducible example
  • “从终端提供代码”是什么意思?
  • 新增信息,感谢评价
  • 可能是您在完成后忘记发送 CTRL+D 吗?顺便说一句,您的代码在这里工作:我在启动后向 STDIN 键入一个 ( 字符,然后键入 CTRL+D,文件 output.txt 包含字符串 OP_OP
  • @airween ,感谢它正在使用该组合,但是为什么它不能与 enter 一起使用,而 enter 不写入文件,只是在终端上写入,

标签: c flex-lexer lex


【解决方案1】:

在 C 语言中,当您写入文件时,输出会保存在缓冲区中,直到有足够的数据值得写入,通常约为 4kb。因此,如果您只写入几个字节,则在文件关闭之前您将看不到文件中的任何内容。

相比之下,当您写入终端时,输出通常只会被缓冲,直到写入换行符为止。如果你写信给stderr,输出总是立即的。

您可以通过在fopen 之后调用setvbuf 来更改流的缓冲。您还可以使用fflush 强制发送流的缓冲区。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2011-06-15
    • 2011-09-23
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多