我有这个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;对于第一种情况,第二种情况返回时没有错误。
我做错了什么?这里的意图是第一种情况产生标记:(空格)(标识符)(空格)(标识符)
答案 0 :(得分:2)
Lex首先进行了最长的比赛。在这种情况下,那将是
.* { printf("invalid token: %s\n", yytext); return -1; }
因为.*
匹配整行。取出*
,只需.
即可。