Lex不遵循匹配规则的顺序

时间:2014-04-17 09:45:48

标签: c lex

这是我的lex代码:

%{
%}

%%
[ \t]*    {printf("tab");}
.+ {
printf("%s", yytext);}
.|\n {
ECHO;
}
%%
int main() {
        yylex();
        return 0;
}


这是我的输入数据:

#include<stdio.h>
int main(){
for(int i = 0 ; i < 10 ; i ++){
for(int j = 0 ; j < i ; j ++){
    printf("*");
}
printf("\n");
}
}

在我看来,。+规则会在遇到'\ n'时停止。
但是我不能在输入行5处触发[\ t]规则。

1 个答案:

答案 0 :(得分:0)

生成的词法分析器将始终选择最长的令牌。为了你的

    printf("*");

规则.+会提供比[ \t]*更长的令牌,因此会选择前者。

顺便说一下,你可以试试这个例子:

%{
%}

%%
[ \t]*   {printf("| |");}
\n       {printf("newline\n");}
[^ \n]+  {printf("%s", yytext);}

%%
int main() {
        yylex();
        return 0;
}