从lex&yacc说到编译器(通讯录问题 1)

原创 2004年02月15日 23:35:00

利用lex和yacc解决通讯录问题(1)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

前言

一般的编译原理教材上关于使用lex和yacc构造词法分析的好例子并不多.很多教程都只是在讲解词法分析和语法分析的时候简单地提到了一下lex和yacc这两个工具,甚至有很多国内的大学教材对lex和yacc只字不提。其实lex和Yacc并非只是为了构造编译系统而开发的。本节通过一个提取通讯记录的信息的简单问题,来讲解一下lex和yacc的使用.

提取通讯录的信息

前几天收到朋友询问一下如何通过词法,语言分析,把一个通讯录中的人物姓名和电话号码的信息提取出来。我把问题改了一下,大致如下:

 

我有个记事本,里面的信息都是电话机生成的通讯记录信息。以文本格式保存在record.txt文件里面。里面的信息是以下面的方式组成的。

---------2004.1.10----------
姓名:jeclee

电话:05513606124
---------2004.1.11----------

姓名:wangan

电话:075528979205

 

现在我要建立一个数据库系统,需要把跟我同过电话的人的姓名和电话号码都输入进去。那么我需要考虑从这种电话机生成的记录格式文件中提取有用的信息。当然,解决的办法多不胜数,但是本节,我们将探讨使用lex和yacc两个工具,十分方便的构造语法分析器,来里面的信息。

 

寻找lex和yacc两个工具

或许你觉得动用编译原理来解决这种问题太麻烦了,但是当我们有了lex和yacc后,复杂的处理将被简化。Lex和yacc这两个东西本来是unix下的两个工具,一般大家使用windows操作系统就需要在网上去寻找。我使用的是cygwin中的flex.exe和bison.exe。bison.exe就是yacc.而cygwin就是一个在windows平台上模拟unix的工具。大家可以去下一个cygwin就可以用了。

 

词法分析器的输入文件

关于正则表达式的问题,我在本系列前面的文章中已经提到过,其详细的讲解请大家参考编译原理教材。

这里我先给出一些基本的词法的正则表达式,它们都是几乎在每个词法输入文件里面都会出现的。

digit        [0-9]

number       {digit}+

letter       [a-zA-Z_]

identifier   ({letter}|_)({number}|{letter}|_)*

newline      [/n]|[/r][/n]

whitespace   [ /t]+

在电话机中的记录文件中另外还有标记头---------2004.1.10----------“我们没有考虑。标记头的正则表达式十分简单,就是”-“和数字和点的组合而已,那么可以很容易地写下它的正则表达式。

Begin [-]+({number}[.])+[-]+

这里的[-]表示的”-“符号,而number前面已经给出,为任意一个整数.而逗号”.”也是以[.]表示出来.那么({number}[.])+就表示记录头里面的日期信息,可是这里我们并不需要知道日期信息,所以就没有必要把它单独提取出来,而完全可以埋藏在一个简单的正则表达式里面。

好了,把这些正则表达式整理到一个名字为record.l的flex输入文件里面就可以了。

整个电话机记录都使用一种固定的文法形式,那么文法输入文件的编写就相对简单,完成词法分析后,我们的工作差不多就完成了一半了。

 

2003-1-13

作者:唐良 tangl_99

QQ:8664220

msn:tangl_99@hotmail.com

email:tangl_99@sohu.com

成都,四川大学,计算机学院

 

小白说编译原理-6-lex和yacc环境配置-多图

lex和yacc的使用很简单,但环境配置却是各种问题,本章说明lex和yacc在windows下的环境配置。软件需求: 系统 win7-64位(win7-32, win8, win10全部通过) ...
  • lipeng08
  • lipeng08
  • 2016年05月06日 11:14
  • 4477

基于Lex 和 Yacc 的 C 语言编译器

最近由于项目需要,看了点关于编译原理和编译器等方面的资料,特别是词法分析和语法分析部分,现做一下小结。       一、编译器及其工作流程        编 译器,是将便于人编写,阅读,维护的高...
  • Chinamming
  • Chinamming
  • 2013年11月26日 23:07
  • 6995

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

作者: 胡彦 2013-4-28 代码下载地址:http://pan.baidu.com/share/link?shareid=579088&uk=253544182 本框架是一个lex/yacc...
  • huyansoft
  • huyansoft
  • 2013年04月27日 17:59
  • 16257

从lex&amp;yacc说到编译器

  • 2017年04月18日 20:34
  • 46KB
  • 下载

编译器是怎么工作的?使用yacc 和lex 写一个计算器(1)

编译器是怎么工作的?使用yacc 和lex 写一个计算器 前天开始学yacc 和lex编译器,找了一通文档,发现没有好的文档,都是一上来就给初学者来个下马威讲高深的玩意, 所以我决定写一篇...
  • lbaby
  • lbaby
  • 2013年04月16日 17:13
  • 1040

基于Lex 和 Yacc 的 C 语言编译器

一、编译器及其工作流程         编 译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输...
  • carltraveler
  • carltraveler
  • 2017年03月29日 13:49
  • 268

跟我一起写编译器(一)——lex&yacc【转载】

跟我一起写编译器(一)——lex&yacc【原创】 出处http://www.cnblogs.com/lucasysfeng/p/4842310.html    第一节、工欲善其事,必先利其...
  • zdy0_2004
  • zdy0_2004
  • 2015年09月29日 12:02
  • 429

Lex/Yacc的学习——《编译原理及实践》附录B tiny编译器源码在linux下编译实现

首先,在网上下载tiny编译器源码。      解压后,发现内部
  • gaixm
  • gaixm
  • 2014年06月17日 20:22
  • 1547

lex_yacc_win.zip(Windows下的编译器生成系统)

  • 2008年10月26日 17:39
  • 3.73MB
  • 下载

用lex和yacc写的tiny c编译器

  • 2008年11月20日 21:18
  • 18KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从lex&yacc说到编译器(通讯录问题 1)
举报原因:
原因补充:

(最多只允许输入30个字)