2016-01-23 2 views
-4

"auto" {count(); Возвращение (АВТО); }Использование функции подсчета счетчиков

"break" {count(); возврата (ПАУЗА); }

"case" {count(); вернуться (CASE); }

"char" {count(); Возвращение (СИМ); }

Какова роль count() в lex?

Кроме того, выражение «столбец + = 8 - (столбец% 8);» в следующей функции не ясна

void count() 
{ 
    int i; 

    for (i = 0; yytext[i] != '\0'; i++) 
     if (yytext[i] == '\n') 
      column = 0; 
     else if (yytext[i] == '\t') 
      column += 8 - (column % 8); 
     else 
      column++; 

    ECHO; 
} 
+0

В чем вопрос? –

+0

столбец + = 8 - (столбец% 8); Какая польза от этого утверждения? Это можно записать в виде столбца + = 8; –

+0

@Venkatesan: только если столбец% 8 равен 0. Это ясно, просто глядя на то, что вы написали. Выражение перемещает столбец в следующий кратный 8. – rici

ответ

1

Это только функция, которую кто-то написал; он не имеет ничего общего с flex. И это может быть не хорошая модель написания лексических анализаторов, поэтому я бы рекомендовал не использовать ее в качестве руководства.

Функция пытается сохранить текущую позицию столбца, принимая во внимание стоп-сигналы. Поэтому, когда он попадает на вкладку, он перемещает номер столбца на следующую вкладку, предполагая, что они составляют восемь символов.

Очевидно, что осложнение бессмысленно в случае этих шаблонов, поскольку они не могут содержать символы новой строки или вкладки. column += yyleng; было бы достаточно для такого шаблона. Я полагаю, кто бы ни писал, это не беспокоило насчет оптимизации, что справедливо.

0

О.П. выяснен вопрос, указывая на это заявление:

column += 8 - (column % 8); 

Это не так, как ОП предполагается, так же, как

column += 8; 

Это форма часто встречается на вкладке вспенивания, например, установка табуляции в столбцах 0,8,16,24 (при подсчете от нуля и если интервал вкладок равен 8). Точка вычитания (column % 8) от 8 и добавление , что в столбец состоит в том, что разница - это расстояние до следующего табу-стопа. Так,

  • если колонка находится в диапазоне [0 .. 7], он будет отображен 8,
  • если колонка находится в диапазоне [8 .. 15], он будет отображаться в 16,
  • и так далее

в каждой точке, колонке это смещение от левого края (где символ новой строки г.у.т. с). Функция count() предполагает, что нет других непечатаемых символов, кроме \n (новая строка) и \t (вкладка).

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