2015-05-04 45 views
0

所以標題可能有點誤導,但我想不出有什麼更好的方式來表達它。如何在lex中打印評論?

基本上,我正在用cygwin/lex編寫一個詞法掃描器。部分代碼讀取一個令牌/ *。它進入預定義的狀態C_COMMENT,並在C_COMMENT「/ *」結束時結束。下面是實際的代碼

"/*" {BEGIN(C_COMMENT); printf("%d: /*", linenum++);} 
<C_COMMENT>"*/" { BEGIN(INITIAL); printf("*/\n"); } 
<C_COMMENT>. {printf("%s",yytext);} 

當評論是在一行代碼工作,如

/* * Example of comment */ 

這將打印當前行號,與後面的註釋。但是,如果評論跨越多行,則不起作用。將第三行重寫爲

<C_COMMENT>. {printf("%s",yytext); 
       printf("\n");} 

不起作用。這將導致\ n爲評論中的每個字母打印。我猜它與C有沒有任何關係,或者我使用的狀態是錯誤的。

希望有人能夠幫助我:)

此外,如果有您需要的任何其他信息,只問,我會提供。

回答

2
  1. 回聲通過圖案掃描的令牌的最簡單方法是使用特殊的動作ECHO

    "/*"   { printf("%d: ", linenum++); ECHO; BEGIN(C_COMMENT); } 
    <C_COMMENT>"*/" { ECHO; BEGIN(INITIAL); } 
    <C_COMMENT>. { ECHO; } 
    
  2. 上述規則無註釋內的換行匹配,因爲在(F )法.不匹配換行:

    <C_COMMENT>\n { linenum++; ECHO; } 
    
  3. 識別C註釋的更快的方法是用一個單一的正則表達式,雖然它有一點困難閱讀:

    [/][*][^*]*[*]+([^/*][^*][*]+)*[/] 
    

    在這種情況下,你必須重新掃描評論數換行,除非你得到柔性做行數計數。

  4. 如果您請求該功能(使用%option yylineno),flex掃描儀會在yylineno中保留行號計數。它通常比保持自己的數量更高效,並且總是更可靠。但是,在操作中,yylineno的值是模式末尾的行號計數,而不是開始位置,這可能會導致多行模式的誤導。常用的解決方法是在令牌掃描開始時將yylineno的值保存在另一個變量中。