`
mypyg
  • 浏览: 548050 次
  • 性别: 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的使用及说明,文件的生成

    Lex 输入文件分为三个部分,使用 %% 来分隔每个部分。第一个 %% 是必须的,在它后面是规则部分。如果不定义任何规则,缺省的动作是匹配任何文本并拷贝到输出。缺省的输入和输出是 stdin 和 stdout。 定义部分: 第...

    lex&yacc语言解析

    在给定的文件列表中,我们可以看到一些可能与学习和使用Lex和Yacc相关的资源: 1. Y2.C, Y1.C, Y3.C, Y4.C:这些可能是使用Yacc生成的语法分析器的源代码文件,每个可能对应于不同的阶段或部分的语法分析。 2. ...

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

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

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

    在IT领域,开发一个能解析和计算算术表达式的程序是一项基础且重要的...总之,这个项目展示了如何使用Lex和Yacc这两个经典的编译工具来解析和计算算术表达式,对于学习编译原理和理解软件开发底层逻辑具有重要意义。

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

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

    LEX应用举例 LEX

    第三部分是 yywrap 函数的定义,yywrap 函数是 Lex 解析器的入口函数,它将被调用来解析输入文件并生成tokens。 在这个例子中,yywrap 函数返回一个值,表示 Lex 解析器已经完成解析工作。 Lex 语言的基本概念 ...

    lex_yacc_example

    本文将深入探讨lex和yacc的工作原理,并通过一个名为"lex_yacc_example"的实际例子来阐述它们的使用方法。 首先,lex(现在通常被称为flex)是一个词法分析器生成器,它的主要任务是从源代码中识别出基本的语法单元...

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

    《使用yacc、lex、ParserGenerator与MFC动态解析及运行VC资源文件》 在软件开发过程中,有时我们需要处理和解析资源文件,特别是在Windows平台上,Visual C++(VC)的资源文件(.rc)用于存储应用程序的用户界面...

    lexYacc简单编译器

    总结来说,"lexYacc简单编译器"是一个实践编译原理的好案例,它展示了如何使用lex和yacc工具来实现词法分析和语法分析,从而理解和掌握编译器的基本工作流程。通过学习和实践这个项目,不仅可以加深对编译器内部机制...

    Lex与Yacc学习资料

    总的来说,这份“Lex与Yacc学习资料”是一个全面了解和掌握词法分析和语法解析技术的宝贵资源,对于那些对编译原理、语言解析或编译器构造感兴趣的人来说,无疑是一份不可多得的学习材料。通过深入学习,你将能够...

    LEX.pdf 有關LEX的詳細介紹

    - **文件命名**:尽管`lex.l`是最常见的文件名,但你可以使用任何其他文件名来存储源文件。 #### 四、高级应用 ##### 1. 与YACC结合使用 - **YACC简介**:YACC是另一个用于生成解析器的工具,通常与LEX搭配使用,...

    编译原理课程设计Lex Yacc

    在课程设计中,你将有机会实践使用Lex和Yacc来创建一个简单的编译器。首先,你需要定义源语言的词汇表和语法规则,然后用Lex编写词法分析器的规则,接着用Yacc编写语法分析器的规则。这两个工具会自动生成C代码,你...

    LEX和YACC的PDF文件

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

    借助Lex和Yacc进行词法语法分析

    Lex规则文件主要用于识别并分类输入文本中的各个记号,而Yacc文法则用于解析这些记号的组合,构建出反映程序逻辑结构的语法树。 总之,借助Lex和Yacc进行词法语法分析,不仅能够加深对编译原理的理解,还能在实践中...

    LEX生成工具生成统计文本.rar_LEX_lex 统计字符数_生成文本文件

    在本案例中,我们讨论的是如何使用LEX来统计文本文件中的字符数、单词数和行数。 LEX的工作原理是通过读取一系列正则表达式和动作对来创建一个词法分析器。这些规则定义了输入字符串中不同部分的模式,当匹配到这些...

    lex 和yacc的使用说明

    对于那些希望深入了解Lex的高级特性的开发者来说,还有一些额外的功能可以探索,例如使用正则表达式、处理复杂输入等。这些功能可以帮助开发者更灵活地定制词法分析器,以适应特定的应用场景。 - **使用正则表达式*...

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

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

    lex_实验-编译原理词法分析器实现

    解压后,我们需要使用lex工具将.l文件转换为C代码,然后编译生成词法分析器。例如,使用命令行工具: ```bash lex lex_file.l gcc lex.yy.c -ll -o lexer ``` 其中,`lex_file.l`是我们的词法规则文件,`lex.yy.c`...

    lex和yacc程序

    2. **ParGen.exe**:这可能是一个名为ParGen的可执行文件,它可能是一个辅助工具或者与lex和yacc相关的解析工具,但具体功能需查看文档或运行后才能确定。 3. **yacc-docs.txt**:这应该是yacc的相关文档,可能包含...

    屏幕录像专家LEX播放器

    总的来说,屏幕录像专家LEX播放器是一款高效、专业的LEX格式视频播放工具,它提供了一种简单易用的方式来播放和管理由屏幕录像专家软件生成的录像文件,为用户带来了极大的便利。无论是在工作还是生活中,只要涉及到...

Global site tag (gtag.js) - Google Analytics