为什么lex试图匹配整行而不仅仅是一个令牌呢?

时间:2014-12-28 03:55:55

标签: lex

我有这个lex文件:

COMMENT \#.*\n
SPACE [\x20\n\r\t]
L [a-zA-Z_]
D [0-9]

%%

{COMMENT}                      |
{SPACE}+                       ;
{L}({L}|{D})*                  { printf("identifier token: %s\n", yytext); return 1; }
-?{D}*                         { printf("int number token: %s\n", yytext); return 1; }
.*                             { printf("invalid token: %s\n", yytext); return -1; }

%%

#include <stdio.h>

int yywrap() {
    return 1;
}

int main() {
    while(yylex() > 0) {};
    return 0;
}

我说有两个文件。

案例1:

#comentario de prueba
   print nestor

案例2:

#comentario de mierda
print

使用这样的lex定义,我收到一个错误:&#34;无效的令牌:打印nestor&#34;对于第一种情况,第二种情况返回时没有错误。

我做错了什么?这里的意图是第一种情况产生标记:(空格)(标识符)(空格)(标识符)

1 个答案:

答案 0 :(得分:2)

Lex首先进行了最长的比赛。在这种情况下,那将是

.*                        { printf("invalid token: %s\n", yytext); return -1; }

因为.*匹配整行。取出*,只需.即可。