本节书摘来自华章计算机《编译与反编译技术实战》一书中的第1章,第1.2节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.2 词法分析生成器LEX

词法分析是编译过程的第一个阶段,其任务就是将输入的各种符号转化成相应的标识符号,转化后的标识符很容易被后续阶段处理。

LEX是LEXical compiler的缩写,是UNIX环境下非常著名的工具,主要功能是生成一个词法分析器的C源码,描述规则采用正则表达式。描述词法分析器的文件*.l经过LEX编译后生成一个lex.yy.c的文件,然后由C编译器编译生成一个词法分析器。

LEX接收用户输入的正则表达式,识别这些表达式并且将输入流转化为匹配这些表达式的字符串。在这些字符串的分界处,用户提供的程序片段被执行。LEX代码文件将正则表达式和程序片段关联,将每一条输入对应到由LEX生成的程序的表达式,且执行相应的代码片段。

为了完成任务,除了需要提供匹配的表达式以外,用户还需要提供其他代码,甚至是由其他生成器产生的代码。用户提供一般程序设计语言的代码片段完成程序识别表达式后的工作。因此,用户自由编写动作代码时,并不影响其编写高级语言代码来匹配字符串表达式。这就避免迫使用户使用字符串语言来进行输入分析时,也必须使用同样的方法来编写字符处理程序,而这样做有时是不合适的。LEX不是完整的语言,它是一个新语言的生成器,可以插入各种不同的被叫作“宿主语言”的程序设计语言中。就像大多数高级语言可以生成在不同计算机硬件上运行的代码一样,LEX可以生成不同的宿主语言。宿主语言用于LEX生成输出代码,也用于用户插入程序片段,这使得LEX适用于不同的环境和不同的使用者。每一个应用程序可以是硬件、适用于该任务的宿主语言、用户背景和局部接口属性的直接结合。现在,LEX唯一支持的宿主语言是C,过去也支持过其他语言。Fortran LEX自身一般运行于UNIX或Linux系统之上,但是LEX生成的代码可以在任何适当的编译器上使用。

LEX将用户输入的表达式和动作代码转换为宿主语言,生成的函数一般名为yylex。yylex识别字符流中的表达式,并且当每一个表达式被检测出来后,输出相应的动作。

LEX的文件结构简单,分为三个部分:

declarations
%%
translation rules
%%
auxiliary procedures

分别是声明段、规则段和辅助部分。

1)声明段包括变量、符号常量和正则表达式的声明。希望出现在目标C源码中的代码,用“%{…%}”括起来。比如:

%{
#include <stdio.h>
#include "y.tab.h"
typedef char * YYSTYPE;
char * yylval;
%}

2)规则段是由正则表达式和相应的动作组成的。如

[0-9]+              printf("Int     : %s/n",yytext);
[0-9]*/.[0-9]+      printf("Float   : %s/n",yytext);

“[0-9]+”是描述整数的正则表达式,“[0-9]*/.[0-9]+”是描述浮点的正则表达式,后面的printf即为它们对应的动作。

值得注意的是,LEX依次尝试每一个规则,尽可能地匹配最长的输入流,即规则部分具有优先级的概念。比如下面的规则部分

%%
A     {printf("run");}
AA    {printf("like ");}
AAAA  {printf("I ");}
%%

对于内容“AAAAAAA”,LEX程序会输出“I like run”,首先匹配最长的4个“A”,之后在剩下的三个“A”中匹配两个“A”,直到最后的一个“A”。可以看出LEX的确按照最长的规则匹配。

3)辅助部分放一些扫描器的其他模块,可以包含用C语言编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。辅助部分也可以在另一个程序文件中编写,最后再链接到一起。生成C代码后,需用C的编译器编译,链接时需要指定链接库。

本书的第3章将更加详细地介绍LEX及其用法。需要说明的是,对于GNU/Linux用户,与UNIX环境中LEX对应的工具是Flex,其具体用法和LEX相似,这里不再赘述。

《编译与反编译技术实战》——1.2 词法分析生成器LEX相关推荐

  1. 《编译与反编译技术实战 》一2.3 编译器的设计与实现概述

    本节书摘来自华章出版社<编译与反编译技术实战 >一书中的第2章,第2.3节,庞建民 主编 ,刘晓楠 陶红伟 岳 峰 戴超 编著,更多章节内容可以访问云栖社区"华章计算机" ...

  2. 《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

    本节书摘来自华章计算机<编译与反编译技术实战>一书中的第1章,第1.1节,作者 刘晓楠 陶红伟 岳峰 戴超,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1 ...

  3. 《编译与反编译技术实战》——2.1节编译器、解释器及其工作方式

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章,第2.1节编译器.解释器及其工作方式,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区&quo ...

  4. 《编译与反编译技术实战》——第2章编译器实践概述

    本节书摘来自华章社区<编译与反编译技术实战>一书中的第2章编译器实践概述,作者刘晓楠 陶红伟 岳 峰 戴超,更多章节内容可以访问云栖社区"华章社区"公众号查看 第2章 ...

  5. 《编译与反编译技术实战》——导读

    前 言 "编译技术"是从事软件开发和信息安全相关工作的技术人员必须掌握的基础性技术,也是高等院校计算机科学与技术和软件专业的一门必修专业课,这是理论与实践结合非常强的领域,对提升开 ...

  6. 《编译与反编译技术》——第一章 引论 1.1节编译器与解释器

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.1节,作者庞建民,陶红伟,刘晓楠,岳峰.更多章节内容可以访问云栖社区"华章计算机"公众号查看. 人类之间 ...

  7. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  8. python源代码的后缀名是_Python代码编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  9. Java——编译与反编译

    ** 一.基础知识 ** 1.1 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级 ...

最新文章

  1. 在 Mac OS X 上安装 TensorFlow
  2. php图片上传方案,php图片上传
  3. 多线程编程 RW_LOCK 读写锁
  4. 多媒体技术开发迎来新常态
  5. 自动画线指柡(主图)
  6. CSDN第四届在线编程大赛2014初赛:带通配符的数
  7. 2018年暑假第二周
  8. Jenkins在Windows下的安装与配置
  9. SkeyePlayer rtsp、rtmp低延迟播放器源码解析之64位编译方案
  10. couchbase php,CouchBase + PHP 安装与配置
  11. 【PyQt5与Requests爬虫】设计图形界面(GUI)实现小说下载器-进度条显示
  12. 用Windows Media Service打造的流媒体直播系统
  13. Python-字符串的判断、拆分和拼接
  14. 过完备深度子空间聚类网络:《Overcomplete Deep Subspace Clustering Networks》
  15. 在香港,无法使用迅雷下载怎么办?
  16. Thread与ThreadPool的内存之战
  17. matlab删除mat中的个别变量,从.mat文件中删除变量
  18. 血饮龙城--ios技术支持
  19. c# 自定义甘特表格控件 (原创 学习中请指导)
  20. NBA球员投篮数据可视化

热门文章

  1. 我的世界服务器为什么显示崩溃,我的世界服务器崩溃的指令 | 手游网游页游攻略大全...
  2. 80c51流水灯汇编语言,单片机AT89C51可控流水灯课程设计报告(汇编语言).docx
  3. rip协议中周期性广播路由信息的报文_关于RIP的一点小笔记--华为
  4. aix oracle调整逻辑卷的大小,AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume(示例代码)...
  5. plsql tables 没有表_技术分享 | 在磁盘上查找 MySQL 表的大小
  6. double operator[](int i)_请谨慎使用float和double
  7. unity 下一帧执行_Unity中的Havok Physics物理引擎
  8. 模板设计模式_23种设计模式之模板设计模式
  9. python数据结构与算法分析 第2版_题库 | 百度数据结构 / 算法面试题型介绍及解析 第 2 期...
  10. html中鼠标移走的伪元素,a标签的伪元素的应用——link,hover,visited,active