2016-01-23 66 views
-4

「auto」{count();回報(AUTO); }計數函數的用法

「break」{count();返回(BREAK); }

「case」{count();返回(CASE); }

「char」{count();返回(CHAR); }

count()在lex中的作​​用是什麼?

另外,語句「column + = 8 - (column%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

column + = 8 - (column%8);這個聲明有什麼用?這可以寫成列+ = 8; –

+0

@Venkatesan:只有在列%8爲0的情況下。只需看看你寫的內容即可。表達式將列移動到8的下一個倍數。 – rici

回答

1

這只是某人寫的一個函數;它與flex無關。它可能不是一個如何編寫詞法分析器的好模型,所以我建議不要將其作爲指導。

該函數試圖維護當前列的位置,並考慮到製表位。所以當它碰到一個標籤時,它會將列號移動到下一個標籤頁,假設它們是每八個字符。

顯然,複雜度在這些模式下毫無意義,因爲它們不能包含換行符或製表符。 column += yyleng;就足夠了這種模式。我想,無論誰寫這些都不用擔心優化,這是公平的。

0

OP澄清的問題,指出這種說法:

column += 8 - (column % 8); 

它不是,因爲OP假設,同爲

column += 8; 

這是經常發現製表擴張形式,例如,在列0,8,16,24處設置製表位(如果從零開始計數,並且製表符間隔爲8)。從8減去(column % 8)並加上的點是不同點是到下一個製表位的距離。所以,

  • 如果範圍爲[0 .. 7],它將被映射到8
  • 如果在範圍[8 .. 15],它將被映射到16
  • 等向前

在每個點,是從左邊距的偏移量(其中換行符goe s到)。函數count()假定除\n(換行符)和\t(製表符)以外沒有其他非打印字符。