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就可以看到所有的时间标记都被提取出来了。