2016-01-15 37 views
0

我正在處理嵌套註釋。我想一次跳過儘可能多的無關字符。但模式<COMMENT>[^\n]{-}\//\*{-}\*/\/是非法的。任何建議?flex正則表達式使用{ - }與尾隨上下文

更新
鑑於以下情況:

/**comment* text/**comment text**/comment*/ 

捕獲第一/*後,它進入COMMENT條件。現在我想用一場比賽儘可能多地吃掉字符(不是/**/)。由於flex選擇最長匹配,我不知道如何匹配分離的*(不是*後跟/)和分離/ s。而\//\*不是一個字符類,所以我們無法計算它與另一個類的區別。

+0

能否請您提供您想在_natural language_寫正則表達式的描述?例如,這種組合'\ * { - } \ *'是無效的,但即使您將其修改爲有效的[[* *] { - } [\ *]',也沒有任何意義,因爲它是空集...還要注意,你不能將嵌套註釋與單個正則表達式完全匹配 - 它們需要上下文無關的語法匹配器。 – gudok

+0

@gudok謝謝你的幫助,我已經更新了這個問題。抱歉不澄清它。 – mljli

+0

這個答案可能證明是有用的:http://stackoverflow.com/a/34515078/1566221 – rici

回答

0
%% 
"/\*"    { printf("OPEN_COMMENT [%s]\n", yytext); } 
"\*/"    { printf("CLOSE_COMMENT [%s]\n", yytext); } 
[^*/]+    { printf("TEXT [%s]\n", yytext); } 
"\*"    { printf("TEXT [%s]\n", yytext); } 
"/"    { printf("TEXT [%s]\n", yytext); } 
%% 

這裏最長匹配規則幫助我們。想法是分別匹配獨立的單獨的符號和符號,而所有其他文本是批量消耗的(因此不會降低性能)。

結果爲上面的例子:

OPEN_COMMENT [/*] 
TEXT [*] 
TEXT [comment] 
TEXT [*] 
TEXT [ text] 
OPEN_COMMENT [/*] 
TEXT [*] 
TEXT [comment text] 
TEXT [*] 
CLOSE_COMMENT [*/] 
TEXT [comment] 
CLOSE_COMMENT [*/] 
TEXT [ 
] 
+0

明白了!非常感謝你:) – mljli