使用lex来解析lrc歌词文件

刚学习lex的实践.很简单.

lrc.l:lex文件,定义了time tag标记,以及操作
%{
%}
num [0-9]+
timetag \[{num}+\:{num}+(\.{num}+)?\]
%%
{timetag} { return 1;}
\n ;
. ;
%%
int yywrap()
{
 return 1;
}

%{%}中间为空,没有什么要提前声明的; num,timetag定义了识别一个timetag的正则表达式[00:00][00:00.00]。
第一个%%后定义了找到一个timetag后的操作,这儿是return,如果不return的话会一直找到文件结束.
yywrap返回1表示没有后续文件,如果有多个文件,可以在这儿修改yyin变量的值.

lrc.c: c文件,这儿调用yylex()来获得标记
#include <stdio.h>
extern char* yytext;
extern FILE* yyin;
int main(int argc, char* argv[])
{
 int yychar;
 if(argc >= 2)
 {
  yyin = fopen( argv[1], "r+");
  if(yyin)
  {
   yychar = yylex();
   for(;yychar;)
   {
    printf("tag:%s\n", yytext);
    yychar = yylex();
   }
  }
  else printf("can't open %s\n", argv[1]);
 }
 else printf("lrc filename\n");
 return 0;
}

yyin是lex的输入,yytext是存储token的缓冲指针,程序循环调用yylex()直至yylex()返回0.每获得一个标记就输出一次.
tear.lrc:样本lrc文件
[ti:别说我的眼泪你无所谓]
[ar:东来东往]
[al:]
[by:吴志辉]
[offset:-500]
[00:01.39]www.jpwy.net
[00:16.35][别说我的眼泪你无所谓 - 东来东往
[00:18.39]别说我的眼泪你无所谓
[01:40.09][00:26.01]一个人在这个夜里
[01:44.94][00:30.90]孤单得难以入睡
[01:49.31][00:35.41]真的想找个人来陪
[01:53.05][00:40.06]不愿意一个人喝醉
[01:57.42][00:43.52]醉了以后就会流泪
[02:01.77][00:47.87]数着你给的伤悲
[02:06.09][00:52.18]为什么你总让我憔悴
[02:10.42][00:56.50]别说我的眼睛你无所谓
[03:28.03][02:14.32][01:00.42]看我流泪你头也不回
[03:32.36][02:18.61][01:04.71]哭过了泪干了心变成灰
[03:36.71][02:22.92][01:08.80]我想要的美你还不想给
[03:40.96][02:26.92][01:13.42]伤了的我的心怎去面对
[03:45.43][02:31.43][01:17.79]爱给了你我不后悔
[03:49.81][02:35.84][01:23.17]只希望你给我一次机会
[03:54.16][02:40.20][01:26.45]让我去追让我去飞
[03:58.51][02:44.61][01:30.84]毕竟爱过的心需要安慰
[04:02.68][02:48.66][01:35.19]需要你安慰
[04:02.68][02:48.66][01:35]需要你安慰

步骤:
lex lrc.l 产生lex.yy.c
gcc -o lrc lex.yy.c lrc.c
然后执行:./lrc tear.lrc就可以看到所有的时间标记都被提取出来了。

猜你喜欢

转载自mypyg.iteye.com/blog/845910