lex负责词法解析,而yacc负责语法解析,其实说白了就是lex负责根据指定的正则表达式,将输入的字符串匹配成一个一个的token,同时允许用户将当前匹配到的字符串进行处理,并且允许返回一个标识当前token的标识码。而yacc则负责进行语法解析,将一个个的token最终形成一个完整的语法。

lex和yacc类似的,分为三个部分

%{

这里可以写任何的c代码

比如一些初始化的状态

%}

这里是一些的lex或者yacc的定义

比如lex里的%s

yacc里的%type %token %left %right %union

%%

这里可以写任何的lex或者yacc代码

%%

这里可以写任何c代码

这里需要注意的是,对于一个语法分析器来说,可以不使用lex而自己根据需要来完成,但是使用lex可以直接使用正则来进行匹配,使得整个过程更加简单。而lex与yacc之间的通信就是靠%union里定义的联合体来完成。其实%union里定义的联合体最终会被生成一个叫yylval的全局变量,这个全局变量可以在lex和yacc之间传递变量。

%type<xxx> 这里的xxx必须是%union里定义的一个成员变量,那么%type<xxx> 里定义的类型就会被存储这个成员变量里

%token<xxx> 与%type类似,只是它所代表的是token而已

$$代表当前的type所计算的最终结果,而$1代表type组成式中的第一个变量的值,以此类推

lex定义了一种叫state的东西,其实这个东西很容易理解,比如class abc{} 与function xxx{}同样是{},它们含意其实是不同的,一个代表了类,一个代表了方法定义,因此state这个东西就是定义当前的一个状态,用%s来进行定义。通过BEGIN来开始

END来结束

注:lex->flex yacc->bison 这是两个升级。

mysql中的sql分析器就只用了yacc而没有使用lex,go的语法分析器也一样,只使用了bison,而没有使用flex;而php则同时使用了flex和bison。目前来看,应该是正则在效率上还是有些问题的,因此对于效率要求比较高的一些应用宁愿自己来写lex功能,而不会直接使用lex.

lex 和 yacc 的区别与联系的更多相关文章

  1. Lex和Yacc入门

     Lex和Yacc入门 标签: lexyacc 2013-07-21 23:02 584人阅读 评论(0) 收藏 举报  分类: Linux(132)  原文地址:http://coanor.blog ...

  2. Windows下lex 与 yacc的使用(2)

                                 Windows下lex 与 yacc的使用                                                   ...

  3. Windows下lex 与 yacc的使用

     Windows下lex 与 yacc的使用 首先 下载下载flex和bison.网址是http://pan.baidu.com/s/1dDlfiW5 选择下载就好了,下载后解压到你电脑中的任一盘中. ...

  4. lex与yacc快速入门

    lex与yacc快速入门 [原创] 声明:原创文章,转载注明出处http://www.cnblogs.com/lucasysfeng/ 联系作者:lucasysfeng@gmail.com 第一节.l ...

  5. 正则语言引擎:一个简单LEX和YACC结合运用的实例

    本文先描述了LEX与YACC的书写方法.然后利用LEX与YACC编写了一个简单正则语言的引擎(暂时不支持闭包与或运算),生成的中间语言为C语言. 正则引擎应直接生成NFA或DFA模拟器的输入文件,但在 ...

  6. Lex与Yacc学习(一)之环境配置篇

    Abstract 在开发程序的过程中经常会遇到文本解析的问题,例如:解析 C 语言源程序,编写 脚本引擎等等,解决这种文本解析的方法有很多,一种方法就是自己手动用 C 或者 C++直接编写解析程序,这 ...

  7. 编写Lex和Yacc

    大学课程设计中,有一次是编写Lex(词法分析器的生成器)和Yacc(语法分析器的生成器),编写这类工具软件不是一件容易的事情.这篇文章记录了当时编程时候的主要思想,主要还是编译原理的思想. 准备 Le ...

  8. Lex与Yacc学习(十)之Yacc库

    Yacc库 每个实现都需要有用的例程库,在UNIX系统中,可以通过cc命令行尾端给出-ly标志(或通过其他系统下的等价物)来包含库. 库的内容在不同的实现之间是不同的,但总是包括main()和yyer ...

  9. Lex与Yacc学习(九)之Yacc语法

    Yacc语法 本文讨论yacc语法的格式并描述可用的各种特征和选项 yacc语法结构 yacc语法包括三部分:定义段.规则段和用户子例程段 ...定义段... %% ...规则段... %% ...用 ...

随机推荐

  1. GPS数据处理 - 字符串函数的灵活应用

    题目内容: NMEA- 0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA- The National Mari ...

  2. JSP中Filter中访问Spring管理的beans

    @Override public void init(FilterConfig filterConfig) {  //unchecked = filterConfig.getInitParameter ...

  3. Python 整理一

    ---恢复内容开始--- Python (pailen)最近学习这个语言,其实早在几年前学习perl的时候就知道有这个语言了,在讲perl的那本书后面就推荐学习python,并且还附加了二章的入门.当 ...

  4. SSO单点登录PHP简单版

    前面做了一个新项目,需要用户资源可以需要共享.由于之前没有做过这样的东西,回家之后,立马网站百度"单点登录".帖子很多,甄别之后,这里列几篇认为比较有营养. http://blog ...

  5. 现代OpenGL教程 01 - 入门指南

    原文链接传送门 译序 早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNormal等固定管线API.后来工作需要接触DirectX9,shader也只是可选项而已,跟固定管线一起 ...

  6. JSP使用JDBC ODBC 实例

    1.JDBC ODBC Brige driver是JSP连接数据库的驱动,只要安装了JDK这个驱动就默认安装了 2. 配置JDBC ODBC数据源的步骤:http://blog.csdn.net/li ...

  7. PHP设计模式之装饰器模式

    装饰器模式:如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的功能,则应该使用装饰器模式.简单点说:就是我们不应该去修改已有的类,而是通过创建另外一 ...

  8. QT5中如何使用QFtp类(这个类虽然没有被收录,但一直在更新)

    由于QT5对QML的支持有很大的改进,所以打算将原来基于QT4的程序移植到QT5上,在移植用QFtp类写的程序时傻眼了! Qt5 移除了 QFtp API,原因是其实现质量.QNetworkAcces ...

  9. cf466C Number of Ways

    C. Number of Ways time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  10. 顶尖数据挖掘开发平台(TipDM-D2)产品白皮书

          顶尖数据挖掘开发平台 (TipDM-D2)           产  品  白  皮  书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: http ...