如何在LEX / FLEX中编写非贪婪的匹配?

时间:2010-11-12 15:33:35

标签: regex lex flex-lexer

我正在尝试使用FLEX和BISON解析遗留语言(类似于'C')。除了匹配字符串外,一切都很顺利。

这种相当奇怪的遗留语言不支持在字符串文字中引用字符,因此以下都是有效的字符串文字:

"hello"
""
"\"

我正在使用以下规则来匹配字符串文字:

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

不幸的是,这是一个贪婪的匹配,所以它匹配如下代码:

"hello", "world"

作为单个字符串(hello", "world)。

通常的非贪婪量词.*?似乎不适用于FLEX。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

只是禁止在引号之间加引号。

\"[^"]*\"

答案 1 :(得分:4)

反斜杠转义引号

以下内容也允许:

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

并且不允许在字符串常量中使用换行符。

E.g:

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

并失败:

>>> "\"

在实现类似C的功能时,请务必查找现有的Lex实现,例如:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html