2016-11-24 6 views
0

Я пишу код lex для преобразования вкладок в космос (одна вкладка равна 4 пробелам) и подсчитывает эти пробелы. Код следующим образом:Как вернуться из yylex()?

%{ 
#include<stdio.h> 
int spacebarCount=0; 
%} 

%% 
[\t] { 
     spacebarCount+=4; 
     } 
[ ]  { 
     spacebarCount++; 
     } 
%% 

int main() 
    { 
    yylex(); 
    printf("The spacebar is: %d",spacebarCount); 
    spacebarCount=0; 
    } 

выход должен напечатать заявление: Е ("пробел является:% d", spacebarCount); Однако это не так. Итак, что мне делать, чтобы распечатать вывод, который я хотел? Кроме того, я попытался подставить приведенные ниже операторы в основной функции, но это не сработало.

int main() 
    { 
    do 
     { 
     if(yylex()==0); 
      { 
      printf("The spacebar is: %d",spacebarCount); 
      spacebarCount=0; 
      } 
     }while(1); 
    } 
+0

Вы можете уточнить: когда вы хотите счетчик печататься? В конце файла, конца строки или в какой-то другой точке? –

+0

Я хочу, чтобы граф был напечатан в конце строки. – Hajime

+0

И кроме того, я использую Lex not Flex. – Hajime

ответ

0

В прогибается это может быть обработан путем сопоставления конец файла-с рисунком <<EOF>>:

%{ 
#include<stdio.h> 
int spacebarCount=0; 
%} 

%% 
[\t] { 
     spacebarCount+=4; 
     } 
[ ]  { 
     spacebarCount++; 
     } 
<<EOF>> { 
     printf("The spacebar is: %d",spacebarCount); 
     return 0; 
     } 
%% 

int main() 
    { 
    yylex(); 
    } 
+0

Спасибо Брайан Томпсетт. Если мой вход является стандартным входом (введите ввод с клавиатуры) Соответствует ли <> правилу, когда я ввожу (или пробел) в командной строке? – Hajime

+1

@brian: op может ожидать выход на каждой строке. Здесь нет необходимости в явном правиле EOF, так как yylex просто вернет 0 по EOF по умолчанию. Если вы используете явное правило EOF, вы * должны * возвращать его действие; иначе у вас есть UB. (Вы также должны избегать повторного ввода yylex после этого.) – rici

Смежные вопросы