【问题标题】:Rule cannot be matched in Flex (LEX) when using ^使用 ^ 时无法在 Flex (LEX) 中匹配规则
【发布时间】:2021-02-11 18:55:52
【问题描述】:

我正在尝试在 Flex 中运行一些简单的正则表达式,但我无法让运算符“^”作为否定。 这是我的代码:`

%%


[^abc]      printf("rule triggered\n");
.       
\n

它应该只匹配任何不是“a”、“b”或“c”的字符,但我得到的是: “警告,规则无法匹配”。

“^”的其他用法似乎很好用,^a 匹配任何以“a”开头的字符串,而 [a^b] 匹配任何包含“a”或“b”的字符串。此外,奇怪的是,如果前面有其他内容,规则 [^a] 会按预期工作,例如:

%%

b+[^a]      printf("rule triggered\n");
.
\n

这匹配一个以任意数量的“b”开头且后面没有“a”的字符串,并且似乎可以正常工作。但如果我允许“b”的出现为零,则它将不起作用:

%%
 
b*[^a]      printf("rule triggered\n");
.       
\n

这给出了相同的“警告,规则无法匹配”,果然,不起作用。有点难住了。

ps。如果这很重要,我会在 cycgwin 中使用 Flex(它应该与所有 Lex 语法兼容)。

`

【问题讨论】:

  • 除了产生警告之外,它在哪些方面没有按您的预期工作?我假设您希望每行打印的“规则触发”行少于实际打印一次。对吗?
  • 我只是注意到即使我使用了“a”、“b”和“c”,它也会一直触发,所以我认为它不符合那个特定的规则。您的评论刚刚让我意识到它与“\n”的规则不匹配,这意味着“a”后跟 return 触发了规则,因为“\n”实际上不是“a”、“b”也不是“c”。将“\n”的规则放在第一行可以修复警告并给我预期的行为。非常感谢!

标签: regex compiler-construction flex-lexer lex lexer


【解决方案1】:

规则\n 不能匹配任何东西。它不能匹配任何东西,因为换行符不是ab 也不是c,所以它总是匹配第一条规则,因此第三条规则不可能每条都匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多