编译原理实践 --词法分析程序的自动生成器LEX

Slides:



Advertisements
Similar presentations
专题复习 --- 走进名著 亲近经典 读完《鲁滨孙漂流记》这本精彩的小说 后,一个高大的形象时时浮现在我的眼 前,他就是勇敢的探险家、航海家鲁滨 孙。他凭着顽强的毅力,永不放弃的精 神,实现了自己航海的梦想。 我仿佛看到轮船甲板上站着这样的一 个人:他放弃了富裕而又舒适的生活, 厌恶那庸庸碌碌的人生,从而开始了一.
Advertisements

四、后期物理复习备考建议 不同阶段复习课教学设计(知识建构)的目的 复习课教学 设计的目的 理 解 · 对某知识的全面、抽 象理解 · 抽象知识和具体情景 的转化 综 合 · 多知识点联合解决问 题 基本素质 · 审题、表达、审视答 案等基本能力 复习 ( 一 ) 复习(二) ☆ ☆☆☆ ☆☆  进行科学规划.
开远市第一中学 2014年高考志愿填报指导会 2014年6月26日.
說 劍 《莊子‧雜篇》─ 第 一 組 賴泊錞 謝孟儒 張維真 羅苡芸
德 国 鼓 励 生 育 的 宣 传 画.
控制方长投下的子公司,需要编制合并报表的演示思路
这是一个数字的 乐园 这里埋藏着丰富的 宝藏 请跟我一起走进数学的 殿堂.
人民版必修三专题三复习 近代中国 思想解放的潮流 灵石中学 易吉华.
第二章 企业并购 企 业 并 购 企业 合并 会计 处理 谋求发展: 迅速扩张、突破壁垒、应对外部环境
前进中的山东省昌乐二中.
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
企劃撰寫.
房地产经纪.
《老年人权益保障》 --以婚姻法.继承法为视角
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
忠孝國小自立午餐老師的叮嚀 教師指導手冊.
负 债 第九章 主讲老师:潘煜双 方正为人,勤慎治学.
中央广播电视大学开放教育 成本会计(补修)期末复习
一、神经调节的结构基础和反射[判断正误] 1.反射是一切动物神经调节的基本方式。 (×) 2.反射可分为非条件反射和条件反射,非条件反射可转化 为条件反射。 (√) 3.反射弧由五部分组成,其中感受器是感觉神经末梢,效 应器是传出神经末梢。 (×)
编译原理上机实习
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
初中《思想品德》课程改革 回顾·现状·展望
致亲爱的同学们 天空的幸福是穿一身蓝 森林的幸福是披一身绿 阳光的幸福是如钻石般耀眼 老师的幸福是因为认识了你们 愿你们努力进取,永不言败.
单元辅导(二)   词法分析与有穷自动机.
编 译 原 理 指导教师:杨建国 二零一零年三月.
補充: Input from a text file
“08高考化学学业水平(必修科目)测试的命题和教学对策研究”
中考语文积累 永宁县教研室 步正军 2015.9.
小学数学知识讲座 应用题.
倒装句之其他句式.
Introduction to Lex 電資三 B 盧逸峮
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
C语言程序设计 第十二章 位运算.
高级语言程序设计 主讲人:陈玉华.
第一章 C语言概述.
Compilers Flex & Bison 的安裝使用
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
If … else 選擇結構 P27.
助教:胡光能,解定宝 编译原理讲师:戴新宇
Lexical analyzer generator
编译原理与技术 词法分析(1) 2018/11/28 《编译原理与技术》讲义.
如何寫工程計畫書 臺北市童軍會考驗委員會 高級考驗營 版.
第三章 词法分析.
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
第二章 词法分析 (Lexical Analysis)
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第4章 顺序程序设计.
一元一次方程式的意義 一元一次方程式的解 等量公理與移項法則 自我評量.
12.3.1运用公式法 —平方差公式.
苏 教 版 五 年 级 数 学(上) 用字母表示数 青阳体仁小学 胡春雅.
材料二甲 授課教師:王致傑 老師 (學420、分機5305)
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
輸出與輸入(I/O).
C程序设计.
大綱:整數的加法 整數的減法 蘇奕君 台灣數位學習科技股份有限公司
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第八节 算术运算符和算术表达式.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
遞迴 Recursion.
第十二章 位运算.
美丽的旋转.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
102年人事預算編列說明 邁向頂尖大學辦公室製作.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

编译原理实践 --词法分析程序的自动生成器LEX

由于各种高级程序设计语言的单词形式基本上可以用一组正规式来描述,人们就希望能否构造一个自动生成系统,只要给出程序设计语言的各类单词描述以及识别出各类单词后应输出的结果,这种自动系统便能自动产生此程序设计语言的词法分析程序 Lex就是这样一个工具,他将正规式转换为一个NFA,进而转换为相应的DFA,这个DFA可以识别该正规式所表示的语言的句子

LEX简单的介绍 1 LEX(lexical ananlyzer generator) 一个词法分析程序的自动生成器. LEX是1972年贝尔实验室首先在 UNIX上实现的. 2 FLEX(fast lexical ananlyzer generator) 是对LEX的扩充,它可在MS-DOS下运行. 我们这里实际使用的是FLEX,但仍称呼为LEX.

LEX简单的介绍 LEX能根据给定的正则表达式自动生成相应的词法分析程序 输入:是用LEX 语言写的源程序 生成:用C语言描述的词法分析程序

LEX使用流程 使用LEX的流程如图: LEX源程序 LEX YYLEX.C C编译器 YYLEX.EXE 字符串源程序 符号串源程序 LEX源程序是使用LEX语言编写的词法规则说明,经过LEX翻译后形成目标文件YYLEX.C;再用C编译器对YYLEX.C进行翻译,生成目标程序YYLEX.EXE,它就是词法分析程序,用YYLEX.EXE就可以将字符串源程序转换成符号串源程序.

用LEX语言表达正则表达式 LEX的输入是LEX源程序. 首先介绍如何表示正则表达式. (1)对于单个的字母a,就直接表示成a,如a,+,-等 . (2)[abc]表示字符a,b,或c中的任一个,如[01] 表示0或1 (3)[a-d]表示字符a,b,c或d中的任一个. (4)[^ab]表示除了a或b外的任一个字符.

用LEX语言表达正则表达式 (5). 表示除了换行符之外的任一个字符. (6)”text”表示双引号里的每个字符(包括元字符)都按字符处理,如”ab[01]”就是表示ab[01]是字符串,其中的[和]不是元字符 (7) \ 转义字符 (8){xxx}名字xxx表示的正则表达式。 (9)r|s表示正则表达式r或正则表达式s。 (10)rs表示正则表达式r与正则表达式s的连接。

用LEX语言表达正则表达式 (11)(r)表示()内的优先级高于括号外。 (12)r*表示正则表达式r可重复零次或多次。 (15)r{m,n}其中m,n是正整数,表达正则表达式r的 m~n次重复。 (16)r{m}表示正则表达式r的m次重复。 (17)r{m,}表示正则表达式r的m到多次的重复。 (18)^行的开始,$行的结尾

用LEX语言表达正则表达式 例: 1)二进制数 (0|1)* 2)以aa或bb开头的由a和b任意组成的字符串 (aa|bb)(a|b)*或(aa|bb)[ab]* 3) 任何一个从0~9的数字: [0-9] 4)长度不超过8的小写字符串 [a-z]{1,8}

用LEX语言表达正则表达式 5) 无符号整数 [0-9]+ 6)可带小数点的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)? 7) 可带指数的有符号数 (“+”|”-”)?[0-9]+(“.”[0-9]+)?(E(“+”|”-”)?[0-9]+)? 8)标识符:字母或_开头,后跟字母数字、下划线等字符 [a-zA-Z_]([a-zA-Z_]|[0-9])* 9)空白区 [ \t\n]+

元字符约定 元字符约定:可以为正则表达式起名,这些名字也可使用在其他的正则表达式中,需正则表达式放在大括号中。 例如,无符号整数定义为:num=[0-9]+ 其中,num为正则表达式名。 在有符号的整数的定义中,可以引用正则表达式名num: signedNum=(+|-)?{num} 注意:在定义正则表达式名时并不写大括号,只有在使用正则表达式名时才加上大括号。

用LEX语言表达正则表达式 在方括号(表示字符类)中,大多数的元字符都丧失了其特殊状况,且不必用引号括起来。甚至如果可以首先将连字符(-)列出来的话,则也可以将其看作字符。因此,可将正则表达式(“+”|”-”)写作[-+],但不能写成[+-],这是因为元字符“-”用于表示字符的一个范围。又例如:[.”?]表示了句号、引号和问号3个字符中的任一个字符,此时,这三个字符在方括号中都丧失了它们元字符的含义。 但是有一些字符即使是在方括号中也仍是元字符,如\和^。如果要得到像反斜杠\这种真正的字符就必须在字符前加一个反斜杠。由于引号在方括号内已失去了它们的元字符的含义,所以不能用引号,因此[\^\\]就表示了真正的字符^和\。

LEX源程序结构 LEX源程序是用LEX语言编写的词法规则说明,即用LEX语言对表示高级程序设计语言的单词集的正则表达式进行描述。 1.说明部分 2.识别规则 3.辅助过程。 各部分之间用%%隔开。即: 说明部分 %% 识别规则 %% 辅助过程

LEX源程序结构:说明部分 1 说明部分: 用于定义识别规则中要用到的正则表达式名,包括: 变量说明、 标识符常量说明、 正则定义, C语言的说明信息 (C语言的说明部分必须用分介符%和%括起来)。

LEX源程序结构:说明部分 说明部分由如下形式的LEX语句组成: D1 R1 D2 R2 …… Dn Rn 其中,R1,R2,…Rn使用LEX语言表示的正则表达式;D1 ,D2,…Dn是给正则表达式起的名字,称为正则表达式名。 限定在Ri中只能出现字母表∑中的字符,以及前面已经定义过的正则表达式名,这样就可以定义程序语言的单词符号。

LEX源程序结构:说明部分 例如,用LEX语句写的标识符和无符号整数的定义如下: 标识符:letter [a-zA-Z] identifier {letter}+ 无符号整数:digit [0-9] num {digit}+ C语言的说明信息主要包括将来生成的词法分析程序要使用的一些库文件和全局变量的声明。%{和% }中间的内容会原封不动地复制到LEX生成的词法分析程序的最前部。

LEX源程序结构:说明部分 例如下面的一段代码: %{ #include <stdio.h> int lineno=1; %} //表示一行字符

LEX源程序结构:识别规则 2 识别规则 用正则表达式给出单词的定义,以及在识别出该正则表达式以后要执行的程序片段,具有如下形式的语句: P1 {动作1} P2 {动作2} …… Pn {动作n} 其中,Pi(i=1,2,3……n)是一个用LEX语言描述的正则表达式,也即是单词符号;动作i是C语言的程序语句,表示当在识别出形为Pi的单词符号时,词法分析应执行的动作。该动作一般是返回单词的单词记号及单词值。

LEX源程序结构:识别规则 例如: %% {line }{printf(“%5d %s”,lineno++,yytext);} 这段代码表示识别出一行字符后,输出行号以及这行字符,然后行号递增。yytext是LEX的内部命字,它的内容就是正则表达式line匹配的字符串。 LEX源程序中的识别规则完全决定了词法分析程序的功能。该词法分析程序只能识别P1,P2,…Pn这些单词符号。识别出的单词符号保存在yytext中。

LEX源程序结构:辅助过程 3辅助过程 给出用户所需要的其他操作,它是识别部分某些动作需要调用的过程。如果不是C语言的库函数,则要在此给出具体的定义。这些程序也可以存入另外的程序文件中,单独编译,最后和词法分析程序连接装配到一起。 例如:下段辅助过程: %% main() {yylex(); return 0; }

LEX源程序结构:辅助过程 int yywrap() { return 1; } 这段代码包含了一个调用函数yylex()的main()过程。yylex()是由LEX构造的过程的名字,该过程进行词法分析。

运行FLEX 将上述三段代码连在一起,假设保存在名为exam1.lex的文件中,最好与FLEX在同一目录下,那么,在DOS下进入FLEX所在的目录,FLEX运行就可以产生词法分析程序,运行的命令(根据自己情况更改路径)

运行FLEX 这样就会在同一目录下产生一个文件LEX.YY.C,这就是根据exam1.lex由LEX生成的词法分析程序。接下来可以对LEX.YY.C进行编译(可以用Visual C++ 6.0)从而得到可执行文件LEX.YY.EXE,执行该文件,随意输入一行字符串,按回车则在屏幕上显示该字符串。

一些常用LEX内部名字及含义 在上例中的LEX源程序中包含的C程序中,引用了一个LEX内部命令yytext,下面给出一些常用的LEX内部命字及其含义如下: lex.yy.c LEX输出文件名 yylex LEX扫描例程 yytext 当前被某规则匹配的字符串 yyin LEX 输入文件(默认为stdin,即键盘); yyout LEX输出文件 (默认为stdout,即显示器) input LEX缓冲的输入例程; ECHO LEX默认行为,即将yytext()打印到yyout yywrap 这一函数在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解析。

举例 1.例子 exam2.txt 这段代码由LEX产生的程序的功能是:输入以字符a开头或结尾的任意字符串,则将该字符串显示出来,而对其他的输入串则不能输出。因为在LEX代码中,识别出.*\n描写的单词后,没有动作,所以就没有输出。对于{ends_with_a}和 {begins_with_a}描述的单词,用ECHO输出到yyout. 这个LEX输入还有一个值得注意的特征:所列的规则具有二义性(ambiguous),这是因为输入串可匹配多个规则。实际上,无论它是否以a开头或结尾,都可与表达式.*\n匹配。

LEX有一个解决这种二义性的优先权系统。首先,LEX总是匹配可能的最长子串(因此LEX总是生成符合最长子串原则的扫描程序)。其次,如果最长子串仍与两个或更多个规则匹配,LEX就选取列在前面的规则。正是由于这个原因,上面的LEX输入文件就将{ends_with_a} ECHO ;和{begins_with_a} ECHO;放在前面,如果按下面的顺序列出 .*\n; {ends_with_a} ECHO ; {begins_with_a} ECHO; 则不会有任何输出。

2.pl0程序的词法分析程序 3.扫描器,用于计算一个文件中的字符数,单词数和行数(类似Unix 中的wc 程序)