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

13

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

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

"hello"
""
"\"
我使用以下规则匹配字符串文字:
\".*\"            { yylval.strval = _strdup( yytext ); return LIT_STRING; }

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

"hello", "world"
作为一个单一的字符串 (hello", "world)。
在FLEX中通常的非贪婪量词.*?似乎不起作用。有什么想法吗?

这可能会对您有所帮助:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html - Ciro Santilli OurBigBook.com
2个回答

14

要禁止在引号中间使用引号。

\"[^"]*\"

啊,我试过了,但是我在方括号中错误地转义了双引号。非常感谢! - stusmith
太棒了!我在想是否有一个开关。 - xis

4

反斜杠转义引号

以下方法也可以实现:

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

禁止字符串常量内部换行。

例如:

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

并在以下情况下失败:
>>> "\"

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接