2010-11-12 66 views
12

我正在嘗試使用FLEX和BISON解析一種遺留語言(類似於'C')。除了匹配字符串之外,一切都很好。如何在LEX/FLEX中編寫非貪婪的匹配?

這種奇特的傳統語言不支持引用在字符串中的字符,所以下面都是有效的字符串文字:我使用下面的規則來匹配字符串文字

"hello" 
"" 
"\" 

\".*\"   { yylval.strval = _strdup(yytext); return LIT_STRING; } 

可惜這是一個貪婪的匹配,所以它匹配類似下面的代碼:

"hello", "world" 

作爲單個字符串(hello", "world)。

通常的非貪婪量詞.*?在FLEX中似乎不起作用。有任何想法嗎?

+0

這可能感興趣你:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html – 2013-04-10 10:26:46

回答

11

只是禁止在引號之間加上引號。

 
\"[^"]*\" 
+0

啊,我試過了,但我錯誤地避開了方括號中的雙引號。非常感謝! – stusmith 2010-11-12 16:03:57

+0

絕妙的主意!我在想是否有開關。 – xis 2011-10-16 18:49:52

4

反斜線引號

下也允許它:

\"(\\.|[^\n"\\])*\" { 
     fprintf(yyout, "STRING: %s\n", yytext); 
    } 

並禁止用於字符串常量內換行。

如:

>>> "a\"b""c\d""" 
STRING: "a\"b" 
STRING: "c\d" 
STRING: "" 

上卻失敗:

>>> "\" 

在實現這樣的C-like特徵,一定要尋找現有的記載實現,如:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html