【问题标题】:Why is lex trying to match the whole line instead of just a token?为什么 lex 试图匹配整行而不是仅仅一个标记?
【发布时间】:2014-12-28 12:00:32
【问题描述】:

我有这个 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;
}

我有,比如说,两个文件。

案例一:

#comentario de prueba
   print nestor

案例 2:

#comentario de mierda
print

使用这样的 lex 定义,我得到一个错误:“invalid token: print nestor”对于第一种情况,而第二种情况返回没有错误。

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

【问题讨论】:

    标签: lex


    【解决方案1】:

    Lex 先取最长的匹配。在这种情况下,这将是

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多