欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用lex来解析lrc歌词文件

程序员文章站 2022-06-21 15:08:08
...
刚学习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就可以看到所有的时间标记都被提取出来了。