代码之家  ›  专栏  ›  技术社区  ›  stusmith

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

  •  12
  • stusmith  · 技术社区  · 14 年前

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

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

    "hello"
    ""
    "\"
    

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

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

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

    "hello", "world"
    

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

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

    2 回复  |  直到 11 年前
        1
  •  13
  •   stusmith    14 年前

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

    \"[^"]*\"
    
        2
  •  4
  •   Ciro Santilli OurBigBook.com    9 年前

    反斜杠转义引号

    以下也允许:

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