【问题标题】:How does one use REJECT in flex?如何在 flex 中使用 REJECT?
【发布时间】:2011-09-20 01:26:33
【问题描述】:

让我们明确一点,我说的是词法分析工具。

对于以下输入:

aa bb cc dd

我需要解析器来匹配以下子字符串:

aa bb

bb cc

cc dd

我有这个正则表达式:

[a-zA-Z]+[ ]+[a-zA-Z]+

但这只匹配:

aa bb

cc dd

有人告诉我 REJECT 命令可用于获取我需要的输出,但我不知道如何应用它。有人可以帮帮我吗?

【问题讨论】:

  • 不,REJECT 在这种情况下不会帮助您。当匹配[a-zA-Z]+[ ]+[a-zA-Z]+ 时,您会希望让词法分析器中字符的当前位置跳回2 个位置,而REJECT 将跳回规则的开头并尝试匹配更多。不过,我对 Flex 不够熟悉,无法回答您的问题。

标签: parsing lex flex-lexer


【解决方案1】:

REJECT 将重新开始扫描,然后您只需“吃掉”您已经匹配的第一个字母字符串。可能这就是你想要的(10 年前:-):

%%
[a-zA-Z]+[ ]+[a-zA-Z]+    { printf("found %s\n", yytext); REJECT; }
[a-zA-Z]+[ ]*

给定输入字符串:

a b c d e

它会产生:

found a b
found b c
found c d
found d e

【讨论】:

    【解决方案2】:

    您可以使用正则表达式在整个集合中枚举 n 和 n + 1 对。

    查看具有“贪婪”向后(或向前)匹配的分组。

    【讨论】:

    • 这个问题不是关于(现代)正则表达式,而是词汇工具 GNU-Flex,它的正则表达式真的正则的(没有分组和所有花哨的东西)。
    【解决方案3】:

    这是解决问题的一种 Flex 解决方案:

    %% "aa bb" {printf("匹配的 aa bb\n");REJECT;} "bb cc" {printf("匹配的 bb cc\n");REJECT;} "cc dd" {printf("匹配的 cc dd\n");REJECT;} . /*忽略其他任何内容*/ %% 主函数() { yylex(); 返回0; } 当我在您的输入上运行代码时,我得到: 匹配 aa bb 匹配的bb cc 匹配 cc dd

    【讨论】:

    • 但是根据 OP 发布的模式[a-zA-Z]+[ ]+[a-zA-Z]+,似乎aa bb cc dd 是一个非常简化的输入示例。我对 Flex 知之甚少,但我没有看到 REJECT 以更一般的方式使用。是吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2017-09-09
    • 2012-12-04
    • 2017-10-26
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多