在我们的一些Flex / Lex代码中,
DIGIT [0-9]
LETTER [A-Za-z]
ID {LETTER}{LETTER}|{DIGIT})*
NUM {DIGIT}+(\.{DIGIT}+)?
因此,123
匹配NUM
和abc123
匹配ID
。的情况下
123abc
,匹配NUM
后跟ID
。然而,
我想要生成错误消息而不是匹配。
有一种简单的方法吗?
答案 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
扫描为两个令牌,这通常会导致语法错误,这是最简单和最易维护的解决方案。