在 Flex 中处理数字后跟字母

Handle number followed by letters in Flex

在一些 Flex/Lex 代码中,我们有,

DIGIT       [0-9]
LETTER      [A-Za-z]
ID          {LETTER}{LETTER}|{DIGIT})*
NUM         {DIGIT}+(\.{DIGIT}+)?

因此,123 匹配 NUMabc123 匹配 ID。的情况下 123abc,这匹配 NUM 后跟 ID。然而, 我希望它生成一条错误消息而不是匹配。

有没有简单的方法可以做到这一点?

您可以只添加一个额外的模式来检测错误。

以下不使用宏,因为我个人觉得它们会分散注意力。但是思路是一样的。

[[:alpha:]][[:alnum:]]*        { return IDENTIFIER; }
[[:digit:]]+"."([[:digit:]]+)? { return NUMBER; }
[[:digit:]]+"."([[:digit:]]+)?[[:alpha:]] { return BAD_NUMBER; }

最后一个模式仅在数字紧跟一个字母时才匹配,并且由于最长匹配规则将覆盖第二个模式。

顺便说一下,一个更好的数字模式是:

[[:digit:]]+("."[[:digit:]]*)?|"."[[:digit:]]+

这将匹配 23..56,许多人认为它们是有效数字。


您可能还会发现 this answer 有趣,尤其是来自其他编程语言的示例。大多数语言(C 和系列除外)确实允许 123abc 被扫描为两个标记,这通常会导致语法错误,这是最简单和最可维护的解决方案。