`
mypyg
  • 浏览: 545331 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

相关推荐

    lex的使用及说明,文件的生成

    1. 概念 2. Lex文件格式 3. 定义部分 4. 规则部分 5. 第三部分 6. lex的变量和函数(宏) 7. 处理方法

    使用lex分析java源程序.rar_LEX_java lex_java 词法分析_lex java_正则表达式

    当 Lex 接收到文件或文本形式的输入时,它试图将文本与正则表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。

    一个Lex/Yacc完整的示例(可使用C++)

    * 如何在lex/yacc中使用C++和STL库,用extern "C"声明那些lex/yacc生成的、要链接的C函数,如yylex(), yywrap(), yyerror()。 * 重定义YYSTYPE/yylval为复杂类型。 * 用%token方式声明yacc记号。 * 用%type方式声明...

    使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器

    使用Lex, Yacc开发的算术表达式解析器,以及算术表达式的计算器。压缩文件包括代码,工程文件,文档。

    LEX和YACC的PDF文件

    本书将教会你如何使用lex&yacc构造一个编译器。lex&yacc是两个用来生成词汇分析器和剖析器的工具。我假设你能够运用C 语言编程,并且理解数据结构的含义,例如“链表”和“树”。导言部分描写了构建编译器所需的基本...

    lex&yacc语言解析

    lex&yacc语言解析

    完整介绍Lex和Yacc Windows 上的使用

    完整介绍Lex和Yacc Windows 上的使用 及工具的按装, 及环境变量的设置, GNU Bison实际上是使用最广泛的Yacc-like分析器生成器,使用它可以生成解释器,编译器,协议实现等多种程序. 它不但与Yacc兼容还具有许多Yacc不...

    使用lex和yacc编写shell

    使用lex和yacc编写shell 在Linux环境中使用C语言编写一个简单的shell命令解释器程序,程序应当具有以下基本特征: 能够执行fg、bg、cd、history、exit等内部命令。 能够执行外部程序命令,命令可以带参数。 使用输入...

    Lex与Yacc学习资料

    内含Lex与yacc.pdf,Lex和yacc从入门到精通.pdf和编译的重要性.pdf文件 供使用lex和yacc的朋友学习

    LEX 源代码文件 以及相关例子 文档

    LEX 源代码文件 以及相关例子 文档 LEX 源代码文件 以及相关例子 文档

    C语言中使用lex统计文本文件字符数

    我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数。让我觉得Lex确实挺有意思的。确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用。这个程序参考了...

    LEX应用举例 LEX

    LEX应用举例 LEX应用举例 LEX应用举例 LEX应用举例

    hanja.lex 系统文件

    Windows XP SP3 C:\WINDOWS\ime\IMKR6_1\Dicts目录下系统文件hanja.lex

    一个对minipascal语言进行编译扫描的lex文件

    此lex文件定义了一系列token,可以对mini pascal语言进行scanner,得到token,进而进行shift和reduce,得到语法书和符号表,完成编译。

    lex文件,可用

    编译原理常用工具lex,很好的支持win7系统,cmd下可运行。

    编译原理课程设计Lex Yacc

    编译原理的课程设计,Lex是生成词法程序的程序,而Yacc是生成语法程序的程序。资源给出了Lex和Yacc的源代码和示例,仅提供一个参考的价值

    用lex工具生成词法分析代码

    用lex工具进行词法分析,通过编写lex.l之类的lex文件,用lex工具生成lex.yy.c,再用C编译器即可对源程序进行词法分析

    基于lex的shell简单实现

    基于lex词法分析,进行输入分析,提取unix相应的系统调用,以及参数,作为shell文件的输入,进行管道,后台,文件重定向,以及基本命令的进行,实现了unix系统中基本的shell功能。 shell.l--lex文件 myshell.c--处理...

    yacc+lex+ParserGenerator+VC6(MFC)动态解析VC资源文件并运行对话框

    功能:动态解析VC6的res文件并生成对话框。(通过Parser Generator生成C++类),对想了解yacc+lex+MFC+(Parser Generator)。非常有帮助

Global site tag (gtag.js) - Google Analytics