2010-11-12 100 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