Flex的Regex规则

Flex的Regex规则,regex,flex-lexer,Regex,Flex Lexer,我对flex lexer的规则感到困惑 我的lexer可以识别十进制和十六进制,但是当我想将它们的并集作为整数时 flex告诉我这是test.l:13:无法识别的规则 这是我的lexer文件: test.l %{ #include <stdio.h> #include <string.h> int yylval; %} digit [0-9] decimal ^({digit}|[1-9]{digit}+)$ hex

我对flex lexer的规则感到困惑

我的lexer可以识别十进制和十六进制,但是当我想将它们的并集作为整数时

flex告诉我这是
test.l:13:无法识别的规则

这是我的lexer文件:

test.l

%{  
    #include <stdio.h>
    #include <string.h>
    int yylval;
%}

digit       [0-9]
decimal     ^({digit}|[1-9]{digit}+)$
hex         0[xX][0-9a-fA-F]+
integer     {hex}|{decimal}

%%
{integer}     {printf("integer - %s \n", yytext);}
%%

// run function
int yywrap(void) { 
    return 1; 
}

int main(void) {
    yylex();
    return 0;
}
%{
#包括
#包括
int yylval;
%}
数字[0-9]
十进制数^({digit}|[1-9]{digit}+)$
十六进制0[xX][0-9a-fA-F]+
整数{hex}{decimal}
%%
{integer}{printf(“integer-%s\n”,yytext);}
%%
//运行函数
int yywrap(void){
返回1;
}
内部主(空){
yylex();
返回0;
}

为什么您认为需要锚定您的
十进制模式?按照它的书写方式,它将只匹配一行上的一个数字,甚至没有任何空格

无论如何,是锚造成了一个问题。在(f)LeX中,<代码> ^ 只能出现在一个模式的开头,并且宏的扩展<代码> {HEX}{{十进制} /代码>在中间有<代码> ^ >

将其更改为
{decimal}|{hex}
不会有帮助,因为flex通常用括号包围宏扩展,以避免错误的运算符分组。(如果宏以
$
结尾,则不会插入括号,但是
{integer}
的立即替换体不会以
$
结尾)

这实际上使得无法在宏中使用
^
锚定,并且很难使用
$
。您可能根本不需要这些锚,所以最简单的解决方案可能就是去掉它们。但如果确实需要锚定模式,则必须在规则本身中锚定模式,而不是在任何宏中锚定模式

您也可以考虑不依赖Flex宏。与C宏一样,它们并不像最初看起来那样有用。如果您想要为字符范围提供有意义的名称,您会发现flex已经提供了它们:

[[:digit:]
[0-9]
<代码>[:xdigit:]
[0-9a-fA-F]
,依此类推(与C的
标题中提供的类别相同)