c - Lex 程序不执行任何操作

标签 c flex-lexer lex

我正在尝试使用 Lex 编写一个程序,它可以识别一些字母、数字并执行一些小操作。问题是该程序无法识别任何东西。事实上,我将规则更改为一个简单的规则来识别所有内容,但仍然什么也不做。发生了什么?也许它很简单(它一定很简单,只有几行),但我是 Lex 新手,我无法修复它。谢谢

简单.l:

%{
  #include <stdio.h>
  #include <ctype.h>
  #include <string.h>
  #include <stdlib.h>

  int count = 0;


%}


/*Reglas*/
%%
[a-zA-Z_]*[a-zA-Z_0-9]*      { count++; printf("%s ", yytext); }
.*                           { count++; printf("%s ", yytext); }

%%
/*Procedimientos de usuario*/

int main(int argc, char * argv[]) {
  FILE * yyin;
  if(argc == 2) {
    yyin =fopen(argv[1],"rt");
    if(yyin == NULL) {
      printf("File %s can not be opened\n", argv[1]);
      exit(-1);
    }
  } else {
    printf("Error in arguments");
    exit(-1);
  }


  yylex();
  printf("Counter : %d \n", count);


  fclose(yyin);
  return 0;

}

输入文件:example.txt

CSC104H1
CSC108H1
CSC204H1
CSC258H1

另外,我需要使用 ctrl+d 来完成程序(正如我在 stackoverflow 中看到的那样),如果没有,程序不会自行完成。

最佳答案

int main(int argc, char * argv[]) {
  FILE * yyin;
  // ...
  yyin = ....
}

这里,yyin 是一个局部变量。扫描仪正在使用具有相同名称的全局变量,此声明将隐藏该变量。

删除声明即可正常工作。

您的第一个线索是扫描仪显然是从标准输入读取,而不是从您指定的文件读取,这就是它等待您输入文件结束指示符的原因。

关于c - Lex 程序不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53672490/

相关文章:

c++ - 如何将常量放入代码内存

c# - 将现有代码库移植到不同的芯片组

c - 错误: Don't know how to make

flex-lexer - 如何在 C++ 中使用 yyextra?

c - Flex/Bison EOF 从标准输入与文件传播

c - 如何在 Linux 上调试 LEX/FLEX 程序

Cmp 指令不匹配

html - Flex,如何处理HTML文件

c - 简单的弹性程序

c - YACC 和 Lex 未定义对 `yylex' 的引用