2012-11-10 93 views

回答

3

它有點複雜。這裏是一個解決方案,我發現:

<INITIAL>{ 
"/*"    BEGIN(IN_COMMENT); 
} 
<IN_COMMENT>{ 
"*/"  BEGIN(INITIAL); 
[^*\n]+ // eat comment in chunks 
"*"  // eat the lone star 
\n  yylineno++; 
} { return COMMENT; } 

的 「明顯」 的解決方案,這樣的事情:

"/*".*"*/" { return COMMENT; } 

將匹配太多。

+0

但是如果評論是這樣的/ * \ n * /「」。將匹配除「\ n」換行符之外的每個字符,以及{return COMMENT; }呢?它在哪裏返回?不能,我只是喜歡這個「/*".*"*/」; – flashdisk

+0

Flex生成的掃描程序是貪婪的,並且會盡可能匹配,因此**「/ *」。*「* /」**將匹配所有**/* foo */fum */**,而不僅僅是**/* foo */** ** {return COMMENT; } **部分僅返回Flex生成的掃描器中的令牌代碼。在大多數情況下,你會想忽略註釋,然後你應該刪除返回語句。 –

+0

如果flex scanner是貪婪的,就像你說的那樣,上面的「顯而易見的」解決方案是如此的錯誤,因爲這是一個例子:/ *評論*/do_my_thing(「oops * /」); – flashdisk