Lex程序什么都不做

时间:2018-12-07 15:30:28

标签: c flex-lexer lex

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

simple.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中所看到的),如果没有,则程序本身不会完成。

1 个答案:

答案 0 :(得分:1)

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

在这里,yyin局部变量。扫描程序正在使用具有相同名称的全局变量,此声明正在对其进行屏蔽。

删除声明,它将正常工作。

您的第一个线索是扫描程序显然是从标准输入中读取的,而不是从您指定的文件中读取的,这就是为什么它等待您键入文件结尾指示符的原因。