Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Flex中的句柄编号后跟字母_Regex_Flex Lexer - Fatal编程技术网

Regex Flex中的句柄编号后跟字母

Regex Flex中的句柄编号后跟字母,regex,flex-lexer,Regex,Flex Lexer,在一些Flex/Lex代码中 DIGIT [0-9] LETTER [A-Za-z] ID {LETTER}{LETTER}|{DIGIT})* NUM {DIGIT}+(\.{DIGIT}+)? 因此,123匹配NUM和abc123匹配ID。万一 123abc,它匹配NUM,后跟andID。然而, 我希望它生成一条错误消息,而不是匹配 有一种简单的方法可以做到这一点吗?您只需添加一个额外的模式即可检测错误 下面不使用宏,因为我个人觉得它

在一些Flex/Lex代码中

DIGIT       [0-9]
LETTER      [A-Za-z]
ID          {LETTER}{LETTER}|{DIGIT})*
NUM         {DIGIT}+(\.{DIGIT}+)?
因此,
123
匹配
NUM
abc123
匹配
ID
。万一
123abc
,它匹配
NUM
,后跟and
ID
。然而, 我希望它生成一条错误消息,而不是匹配


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

您只需添加一个额外的模式即可检测错误

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

[[:alpha:]][[:alnum:]]*        { return IDENTIFIER; }
[[:digit:]]+"."([[:digit:]]+)? { return NUMBER; }
[[:digit:]]+"."([[:digit:]]+)?[[:alpha:]] { return BAD_NUMBER; }
最后一个模式将仅在数字后面紧跟着一个字母时匹配,并且将由于最长匹配规则而覆盖第二个模式

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

[[:digit:]]+("."[[:digit:]]*)?|"."[[:digit:]]+
这将匹配
23.
.56
,许多人认为这是有效的数字



您可能还会发现一些有趣的例子,特别是来自其他编程语言的例子。大多数语言(C&family除外)都允许将
123abc
作为两个标记进行扫描,这通常会导致语法错误,这是最简单也是最容易维护的解决方案。

您是否厌倦了将^-start of string$-end of string放在num regex上^{DIGIT}+(\.{DIGIT}+)$但是在123abc+1.23的情况下,我们得到,错误:无法识别的字符1错误:无法识别的字符2错误:无法识别的字符3错误:无法识别的字符1错误:无法识别的字符。错误:无法识别的字符2错误:无法识别的字符3我想识别第二个数字。+是否始终存在?-^([a-zA-Z]+[0-9]+)\+([0-9]+(?:\.[0-9]+))$不,这是数学运算符,您看到的是一个简单的数学表达式。您不想这样做。如果您开始向Flex定义添加错误规则,您将永远不会停止,并且您将开始创建歧义。您的目标应该是让解析器处理所有错误。