C Lex程序不';我什么也不做

C Lex程序不';我什么也不做,c,flex-lexer,lex,C,Flex Lexer,Lex,我试图写一个程序使用莱克斯,它可以识别一些字母,数字和做一些小事情。问题是程序不能识别任何东西。事实上,我将规则更改为一个简单的规则来识别所有内容,但仍然什么也不做。发生了什么事?也许这很简单(一定很简单,只有几行),但我是莱克斯的新手,我无法修复它。谢谢 简单。l: %{ #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h>

我试图写一个程序使用莱克斯,它可以识别一些字母,数字和做一些小事情。问题是程序不能识别任何东西。事实上,我将规则更改为一个简单的规则来识别所有内容,但仍然什么也不做。发生了什么事?也许这很简单(一定很简单,只有几行),但我是莱克斯的新手,我无法修复它。谢谢

简单。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;

}
另外,我需要使用ctrl+d来完成程序(正如我在stackoverflow中看到的),如果没有,程序本身不会完成

int main(int argc, char * argv[]) {
  FILE * yyin;
  // ...
  yyin = ....
}
这里,
yyin
是一个局部变量。扫描程序正在使用同名的全局变量,此声明将对其进行隐藏

删除声明,它将正常工作


您的第一条线索是,扫描仪显然是从标准输入读取数据,而不是从您指定的文件读取数据,这就是为什么它会等待您键入文件结束指示符。

当您说它什么也不做时,是否意味着除了计数器为0之外没有其他输出?或者什么也没有印,包括柜台?如何运行程序?计数器已打印,但计数器值为0。另一个问题是我需要使用ctrl+d来完成程序并查看输出。如果没有,莱克斯就不会完成。我使用以下命令编译和运行:lex simple.l;gcc lex.yy.c-o prog-ll/您还需要仔细查看您的模式。特别是,
*
将匹配整行,这将比第一个模式的匹配时间长,因此只有当标识符是行上唯一的内容时,才会触发第一个模式。此外,没有模式匹配换行符。您的标识符模式也有点奇怪,因为您将前导字母字符设置为可选的(使用
*
),这意味着它相当于一个简单的
[[:alnum:]*
。我将接受您的建议来创建我的模式,因为我需要编写的真正模式不是模式,而是更复杂的模式。非常感谢你!
int main(int argc, char * argv[]) {
  FILE * yyin;
  // ...
  yyin = ....
}