规则在 Flex (LEX) 中不匹配

问题描述 投票:0回答:0

我有以下匹配时间的正则表达式:

(1[012]|0\d):[0-5]\d[ap]\.m\.
12 小时格式。

我在这个网站上测试了它并确保它有效。

但它在我的 lex 文件中不起作用:

%{
#define DEPARTURES 300
#define FLIGHT_NUMBER 301
#define TIME 302
%}

%option noyywrap

%option yylineno


%%
[A-Z]{2}[0-9]{1,4}   {return FLIGHT_NUMBER;}

"(1[012]|0[0-9]):[0-5][0-9][ap]\.m\."   { return TIME; }

[\t\r ]+  { /* skip white space */ }

.          { fprintf (stderr, "line %d: unrecognized token %c(%x)\n", 
                               yylineno, yytext[0], yytext[0]); }


%%

int main (int argc, char **argv)
{
   extern FILE *yyin;
   int token;

   if (argc != 2) {
      fprintf(stderr, "Usage: %s <input file name>\n", argv [0]);
      exit (1);
   }

   yyin = fopen (argv[1], "r");

   while ((token = yylex ()) != 0)
     printf("%d - %s\n", token, yytext);
   fclose (yyin);
   exit (0);
}

main 函数接受一个输入文件并打印文件中检测到的所有标记。

目前,输入文件的内容只是“10:19a.m.”。

运行时,文件中的每个字符的输出仅为“无法识别的标记”。

我是 Flex 和 lex 的新手,所以我不确定我写正则表达式的方式是否有错误。我唯一能找到的是它不支持

\d
,但即使用
[0-9]
替换它也无济于事。

regex flex-lexer lex
© www.soinside.com 2019 - 2024. All rights reserved.