在Flex中处理数字后跟字母

时间:2015-09-23 11:30:31

标签: regex flex-lexer

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

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

因此,123匹配NUMabc123匹配ID。的情况下 123abc,匹配NUM后跟ID。然而, 我想要生成错误消息而不是匹配。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

您只需添加其他模式即可检测错误。

以下不使用宏,因为我个人觉得它们让人分心。但这个想法是一样的。

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

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

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

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

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

您可能还会发现this answer有趣,特别是其他编程语言中的示例。大多数语言(C&家族除外)都允许将123abc扫描为两个令牌,这通常会导致语法错误,这是最简单和最易维护的解决方案。