【问题标题】:How do I write a non-greedy match in LEX / FLEX?如何在 LEX / FLEX 中编写非贪婪匹配?
【发布时间】:2011-05-09 03:33:17
【问题描述】:

我正在尝试使用 FLEX 和 BISON 解析传统语言(类似于“C”)。除了匹配字符串之外,一切都运行良好。

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

"hello"
""
"\"

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

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

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

"hello", "world"

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

通常的非贪婪量词.*? 在 FLEX 中似乎不起作用。有什么想法吗?

【问题讨论】:

标签: regex lex flex-lexer


【解决方案1】:

反斜杠转义引号

以下也允许:

\"(\\.|[^\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

【讨论】:

    【解决方案2】:

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

    \"[^"]*\"

    【讨论】:

    • 啊,我试过了,但我错误地转义了方括号中的双引号。非常感谢!
    • 好主意!我在想是否有开关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2015-02-11
    • 2011-03-02
    • 2012-08-07
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多