【问题标题】:Why does a Flex program wait forever and not print anything?为什么 Flex 程序永远等待而不打印任何东西?
【发布时间】:2014-10-26 03:53:52
【问题描述】:

我正在翻译首字母缩略词。也就是说,如果它找到“OMS”打印“Organización Mundial del trabajo”,但一旦我编译并运行程序,它就会无限运行。

我使用 Windows 作为开发环境。我看过例子,但我看不出错误在哪里。代码如下:

%option noyywrap    
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
%}

%%
OMS {fprintf(yyout,"Organización Mundial del trabajo");}

%%

int main(int argc, char *argv[]) {
    FILE*yyin=fopen(argv[1],"r");
    FILE*yyout=fopen(argv[2],"w");
    yylex();
    fclose(yyin);
    fclose(yyout);
    return 0;
}

【问题讨论】:

  • FILE*yyin=fopen(argv[1],"r"); 你声明并初始化了一个局部未使用的变量,而全局yyin 保持不变。
  • @n.m.:您的诊断基本上是正确的——我建议将其添加为答案,这样问题就可以结束了。严格来说,main() 中的局部变量 yyin 用于相应的 fclose() 中(尽管它是一个空洞的用法),但你绝对正确的是词法分析器将是使用全局变量yyin(由本地定义隐藏在main() 中)。 Alfito:如果你使用 GCC,你可以使用-Wshadow 来获得关于这个问题的警告。

标签: c flex-lexer lex lexical-analysis


【解决方案1】:
FILE*yyin=fopen(argv[1],"r");
FILE*yyout=fopen(argv[2],"w");

这些行声明并初始化了两个 local 变量,名为 yyinyyout。它们在函数结束时关闭,但在其他方面保持未使用状态(即,没有人对它们进行任何输入/输出)。它们不适用于程序的其余部分。同时,与这些局部变量完全分离的全局变量yyinyyout保持不变。

您需要做的只是从两行中删除FILE*

yyin=fopen(argv[1],"r");
yyout=fopen(argv[2],"w");

现在名称 yyinyyout 指的是程序其余部分已知的全局变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2019-05-18
    • 1970-01-01
    • 2012-12-30
    • 2014-07-03
    • 1970-01-01
    • 2011-05-27
    • 2011-10-27
    相关资源
    最近更新 更多