Part3词法分析 授课:胡静.

Slides:



Advertisements
Similar presentations
第九章 認識勞退新制及因應之道 大葉大學 助理教授 邱祈豪.
Advertisements

任课老师:戴新宇 助教: 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 2014年3月20日.
回顾与展望:高州经验与广东医改 省卫生计生委、省医改办 黄 飞 2015年7月3日.
Tool Command Language --11级ACM班 金天行.
编译原理和技术.
编译原理上机实习
DFA的化简 1. DFA的化简 所谓一个DFA M 的化简是指寻找一个状态数比 M 少的 DFA M' ,使得 L(M)=L(M')
第三章 词法分析 编译程序首先是在单词级别上来分析和翻译源程序的。词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。因此,词法分析是编译的基础。执行词法分析的程序称为词法分析器。 3。1 对词法分析器的要求 词法分析器功能和输出形式.
编 译 原 理 指导教师:杨建国 二零一零年三月.
第三章 词法分析 赵建华 南京大学计算机系 2009年2月.
Chapter 4 流程控制.
正则表达式一点通:正则中的中文.
Oracle数据库 Oracle 子程序.
習慣為成功之本 方智出版社 郭騰尹/著 書摘製作人: 全家便利商店教育訓練中心 盧冠諭 :
班级小插曲.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
助教:胡光能,解定宝 编译原理讲师:戴新宇
Last Lecture Revisited
Lexical analyzer generator
第二章 词法分析 词法记号及属性 词法记号的描述与识别 有限自动机 DFA构建 DFA化简 词法模式的识别过程 子集构造法.
编译原理与技术 词法分析(1) 2018/11/28 《编译原理与技术》讲义.
第三章 词法分析.
Last Lecture Revisited
管理信息结构SMI.
走进编程 程序的顺序结构(二).
元素替换法 ——行列式按行(列)展开(推论)
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
编译技术 授课:胡静.
第二、三章习题讲解
第二章 Java语言基础.
By Sizzle引擎研究 By
2.3 正则表达式 主要内容: 1.正则表达式和正则集; 2.正则表达式和有限自动机的相互转化。.
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第三章 词法分析 本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的自动构造原理。 3.1 对于词法分析程序的要求
数列.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
LOGO 缅怀先烈 雷锋.
$9 泛型基础.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
3.16 枚举算法及其程序实现 ——数组的作用.
词法分析
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
HSC高速输出例程 HORNER APG.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java基本语法 讲师:复凡.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
编译原理 Compiler Principles 第三章 词法分析 湖南大学信息科学与工程学院 软件工程系 杨金民 2019/02.
第三章:词法分析 戴新宇 南京大学 计算机科学与技术系.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十七讲 密码执行(1).
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
编译原理实践 6.程序设计语言PL/0.
编译原理实践 --词法分析程序的自动生成器LEX
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

Part3词法分析 授课:胡静

内容提要 词法分析器的作用 词法分析程序的设计与实现——状态图 词法分析程序的自动生成——有穷自动机

词法分析器的自动产生

LEX工作过程 首先,使用LEX语言写一个定义词法分析器的源程序lex.l。 然后利用LEX编译器将lex.l转换成C语言程序lex.yy.c。它包括从lex.l的正规表达式构造的状态转换图的表格形式以及使用该表格识别词素的标准子程序。 与lex.l中正规表达式相关联的动作是C代码段,这些动作可以直接加入到lex.yy.c中。 最后,lex.yy.c通过C编译器生成目标程序,这个目标程序就是把输入流转换成记号序列的词法分析器。

LEX工作过程

LEX说明 一个LEX程序由如下三部分组成: 声明部分包括变量声明、符号常量声明和正规定义。 声明部分(辅助定义式) %% 转换规则(识别规则) 辅助过程 (用户子程序) 声明部分包括变量声明、符号常量声明和正规定义。

声明部分

声明部分举例

LEX识别规则 LEX程序的转换规则是如下形式的语句: P1 {A1} P2 {A2} … pn {An} LEX程序的第三部分包含action所需要的辅助过程。这些过程可以单独编译,并与词法分析器一起装载。

LEX举例 正规表达式 记号 属性值 ws - if then else id 指向符号表表项的指针 num < relop LT <= LE = EQ <> NE > GT >= GE

LEX举例 %{ /*符号常数定义 LT, LE, EQ, NE, GT, GE, IF, THEN, ELSE, ID, NUMBER, RELOP */ %} /*正规定义*/ dilim [ \t \n] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+\-])?{digit}+)? %%

LEX举例 %% {ws} {/*没有动作和返回值*/ } if {return(IF);} then {return(THEN);} else {return(ELSE);} {id} {yylval = install_id(); return(ID);} {number} {yylval = install_num(); return(NUMBER);} “<” {yylval = LT; return(RELOP);} “<=” {yylval = LE; return(RELOP);} “=” {yylval = EQ; return(RELOP);} “<>” {yylval = NE; return(RELOP);} “>” {yylval = GT; return(RELOP);} “>=” {yylval = GE; return(RELOP);}

LEX举例 %% install_id() { /*往符号表填入词素的过程,yytext指向词素的第一个字符,yyleng表示词素的长度。将词素填入符号表,返回指向该词素所在表项的指针*/ } install_num() /*与填写词素的过程类似,只不过词素是一个数。*/

LEX举例说明 假设由上面的程序生成的词法分析器被给定的一个由两个制表符、一个if和一个空格组成的输入串。 两个制表符是能与模式ws匹配的初始最长前缀。 与ws相关联的动作不做任何事,因此词法分析器移动词素的开始指针yytext使其指向i,并开始查找下一个记号。 下一个匹配的词素是if。请注意,模式if和{id}均匹配这个词素,并且没有能匹配更长串的模式。由于上面的程序中匹配关键字if的模式先于匹配标识符的模式执行,所以if被匹配成关键字。通常,采用将匹配关键字的模式置于匹配标识符的模式之前的策略,可以简单有效的保留关键字。 假设读入的头两个字符是<=。 模式<匹配上第一个字符,但它不是能匹配输入字符串的最长前缀的模式。 LEX采用“选择最长匹配前缀的策略”方便的解决了<和<=之间的冲突。这里,当然<=被选择作为下一个记号。

LEX说明 由LEX创建的词法分析器与语法分析器协同工作的方式如下: 词法分析器被语法分析器调用后,从尚未扫描的输入字符串中读字符,每次读入一个字符,直到发现能与某个正规表达式pi匹配的最长前缀。 词法分析器执行Ai。通常Ai会将控制返回给语法分析器。然后如果不将控制交给语法分析器,词法分析可以继续发现更多的词素,直到某个操作将控制返回给语法分析器。 词法分析器这种不断查找词素,直到以显示的return调用结束工作的方式,使其可以方便的处理空白符和注释。 词法分析器只返回记号给语法分析器,带有与词素相关信息的属性值是通过全局变量yylval传递的。

超前扫描操作 在LEX中我们可以把模式写成r1/r2的形式,其中r1和r2都是正规表达式。它的意思是当一个字符串与r1匹配时,还需要其后的字符串与r2匹配,这样才算该字符串与r1匹配成功。在超前扫描操作符/后面的正规表达式r2表示需要进一步匹配的内容,这里他只是匹配的一个限制,而不是匹配的一个部分。 将Fortran中DO识别为关键字的LEX说明如下: DO 501 I =1.25 DO/({letter} | {digit})* = ({letter} | {digit})*, {动作}

超前扫描符举例 区别Fortran中的关键字和标识符 识别关键字IF的模式可以写为: IF/\(. *\) {letter} 处理Fortran的if语句问题的另一种方法是:当看到字符串IF(后,先确定IF是否被声明为数组。如果是,我们才去匹配上面给出的整个模式。这样的检查使得由LEX说明自动实现一个词法分析器变得很难,而且在运行时可能会花费更多的时间,因为要由模拟状态转化图的程序频繁的判断是否要进行这样的检查。

LEX的实现

单个正则表达式 We will study typical compilation: from programs written in high-level languages to low-level object code and machine code Most of the principles and techniques in this course apply to non-typical compilers and translators

词法分析器

处理多样的REs 将所有的正则表达式的NFA联合在一起,变成一个单一的有限自动机

LEX二义性的处理方法

词法分析器 输出端是Token流 最长匹配 优先级规则 将tokens和终态联系在一起。 当到达一个终态时,就将相应的token输出。

LEX举例

LEX举例 NFA确定化 给出状态转换表

LEX程序举例

Thanks for your time! Questions & Answers