2012-10-24 18 views
2

我想計算關於C++程序的「空行」,「單個註釋」,「塊註釋」。爲什麼正則表達式「//」和「/ *」不能匹配單個註釋和塊註釋?

我寫的工具使用flex.But該工具無法匹配的c + +塊的評論。

1撓曲代碼:

%{ 
    int block_flag = 0; 
    int empty_num = 0; 
    int single_line_num = 0; 
    int block_line_num = 0; 
    int line = 0; 
%} 

%% 
^[\t ]*\n    { 
    empty_num++; 
    printf("empty line\n"); 
} 
"//" { 
    single_line_num++; 
    printf("single line comment\n"); 
} 
"/*" { 
    block_flag = 1; 
    block_line_num++; 
    printf("block comment begin.block line:%d\n", block_line_num); 
} 

"*/" { 
    block_flag = 0; 
    printf("block comment end.block line:%d\n", block_line_num); 
} 
^(.*)\n     { 
    if(block_flag) 
    block_line_num++; 
    else 
    line++; 
} 

%% 
int main(int argc , char *argv[]) 
{ 
    yyin = fopen(argv[1], "r"); 
    yylex(); 

    printf("lines :%d\n" ,line); 
    fclose(yyin); 

    return 0; 
} 

2的hello.c

[email protected]:~$ cat hello.c 
#include <stdlib.h> 

// 
// 
/* 
*/ 

/* */ 

3輸出

[email protected]:~$ ./a.out hello.c 
empty line 
empty line 
lines :6 

爲什麼 「//」 和 「/ *」 所不能比擬的單個評論和塊評論?

+0

這應該用Adobe/Apache Flex進行標記; UI框架?或者這個問題與詞法分析器有關嗎?如果後者;你可能想用Lex/gnu-flex標籤來標記它。這個問題讓我感到困惑。 – JeffryHouser

+1

@ www.Flextras.com這是gnu-flex.thank你! – bbg

回答

4

軟硬度:

  1. 不搜索。它按順序匹配模式,每個模式從另一個結束處開始。

  2. 總是挑選最長匹配的模式。 (如果兩個或多個模式匹配量是相同的,它選擇第一個。

所以,你必須

"//" { /* Do something */ } 

^.*\n { /* Do something else */ } 

假設它剛匹配第二個,所以我們在一行的開頭,假設行開始//。現在,這兩個模式匹配,但第二個匹配整行,而第一個只匹配兩個字符。第二個贏得勝利。那不是你想要的。

提示1:你可能想//意見匹配到行的末尾

提示2:有一個正則表達式將匹配/*的意見,雖然這是一個有點乏味:"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/"不幸的是,如果你使用它不會爲你計算行數,但你應該能夠適應它做你想要的。

提示3:您可能想要考慮從行中間開始的註釋,可能是縮進的。你規則^.*\n將吞下一整條線,甚至沒有看到它內部是否有評論。

提示4:字符串文字隱藏註釋。

+0

謝謝。在你的幫助下,我解決了我的問題。 – bbg

相關問題