Программа Lex ничего не делает - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь написать программу с использованием 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 голосов
/ 07 декабря 2018
int main(int argc, char * argv[]) {
  FILE * yyin;
  // ...
  yyin = ....
}

Здесь yyin является локальной переменной .Сканер использует глобальную переменную с тем же именем, за которым скрывается это объявление.

Удалите объявление, и оно будет работать нормально.

Ваша первая подсказка заключается в том, что сканер явно читает изстандартный ввод, а не из указанного вами файла, поэтому он ждет, когда вы наберете индикатор конца файла.

...