在 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
匹配 NUM
,abc123
匹配 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
被扫描为两个标记,这通常会导致语法错误,这是最简单和最可维护的解决方案。
在一些 Flex/Lex 代码中,我们有,
DIGIT [0-9]
LETTER [A-Za-z]
ID {LETTER}{LETTER}|{DIGIT})*
NUM {DIGIT}+(\.{DIGIT}+)?
因此,123
匹配 NUM
,abc123
匹配 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
被扫描为两个标记,这通常会导致语法错误,这是最简单和最可维护的解决方案。