【编译原理】02词法分析(1)

接上篇 :【编译原理】01引论


        词法分析是编译过程中将字符流转换成为符号流的一个工作阶段,是编译的第一步工作,其后续工作是语法分析。

        词法分析的输入是源代码; 词法分析的输出是符号流; 词法分析需要识别词法错误,即非法的符号、单词等等,但不识别语法错误。

1  词法分析器的作用

        源程序由单词组成,单词是最小的语义单位。

        词法分析器的功能:扫描源程序字符流 ,按照源语言的词法规则识别出各类单词符号,产生用于语法分析的记号序列。

        词法分析器的辅助功能:跳过源程序中的注释和空白,把错误信息和源程序联系起来(错误定位),宏预处理。

1.1词法分析器的工作方式

1.1.1、词法分析器与语法分析器的关系

        1.  词法分析器作为语法分析器的子程序

        2.  词法分析器作为独立的一遍

        3.  词法分析器与语法分析器作为协同程序

1.1.2、分离词法分析器的好处

        可以简化设计

        可以改进编译器的效率

        可以加强编译器的可移植性

2.1记号、模式与单词

        记号:是指某一类单词符号的种别编码,如标识符的记号为id,数的记号为num等。(机内表示)

        模式:是指某一类单词符号的构词规则,如标识符的模式是“由字母开头的字母数字串”。(构词规则)

        单词:是指某一类单词符号的一个特例,如position是标识符。(外部表示)

2.1.1 词法分析器的输出:记号

 记号的种类

        关键字:for, while, if等;

        标识符:position,rate等;

        常数:60

        特殊符号: 算符:+-*/等; 分隔符:分号,空格,引号等等;

记号的属性:

        词法分析器在识别出一个记号后,要把与之有关的信息作为它的属性保留下来,记号的属性是指记号的特征或特性。

        记号影响语法分析的决策,属性影响记号的翻译

        在词法分析阶段,对记号只能确定一种属性 (关键字:一字一种或全体一种; 标识符:一般统归一种,也可分为若干种 ;常数:一般统归一种,也可按类型分种; 运算符:一符一种或一类一种; 分界符:一般用一符一种)

2.1.2 输入的基本单位:单词

        一个被编译的源代码,以字符串的形式输入到词法分析器中,词法分析器的处理单位是“单词”。

         每一个单词对应于词法分析的最终输出 ;单词的不同的构成方式,将产生不同的记号及属性; 注意“单词”还包括程序中的各种特殊符号等。

2.1.3 识别单词的规则:模式

        如何判定一个单词的类型,以及该单词所对应的记号的相关属性,需要通过规则进行区别,这个规则就是模式。

        历史上存在过一些词法模式,对词法分析造成了很大的困难; 形式化描述的词法模式具有严谨、准确的特性; 当前,程序设计语言的词法模式通常使用正规表达式来进行描述;

 2.2 模式的形式化描述    

         字母表(alphabet): 字母表是符号的非空有穷集合,用∑表示

        字符串/符号串/串(String): 符号串是由字母表中的符号所组成的有穷序列

        符号串的长度 :符号串中包含符号的个数,串 s 的长度记为 |s|

        前缀(prefix)、后缀(suffix)、子串(substring)  

        语言(Language): 某个字母表上的符号串的集合

2.3  串和语言

2.3.1 语言的运算

        语言是符号串的集合,集合的运算有并、交、差等

        并运算 — 两个集合的并; 交运算 — 两个集合的交; 差运算 — 两个集合的差;

并运算例如:集合A={ab,cde}, B={0,1}   则  A∪B={ ab,cde,0,1 }

交例如:集合A={ab,cde} B={0,1} 则 AB={ ab1,ab0,cde0,cde1 }

        * 闭包(Kleene closure):0个或多个的连接 L* = L0∪L1∪L2∪L3∪…

        +闭包(Positive closure):1个或多个的连接 L+ = L1∪L2∪L3∪…

         L* = L+ ∪{ε}

 例:Σ={a,b}

Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}

Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}

综合性的例子: L = {A,B,C,…,Z,a,b,c,…,z}  D = {0,1,…,9}

求:1. L ∪ D     2. LD    3. L4   4. L*     5. L(L ∪ D)*    6. D+

2.4  文法和语言的定义

        语言的有穷表示有两个途经: 生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造。识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”,(要么永远继续下去。)

        文法 G 定义为四元组(VT,VN,S,P):

        VT :终结符(terminals)集,其中的元素一般用小写字母或数字表示(a,b,c…0,1..),代表语言中不可再分的基本符号,如汉语中的汉字、C语言中的标识符。

        VN :非终结符(nonterminals)集,其中的元素一般用大写字母表示(A,B,C…),或者用尖括号括起,代表语法单位,如汉语中的语句、段落,C语言中的语句、表达式、函数等。

        S 是一个特殊的非终结符号,称为开始符号(start symbol) S 至少要在一条产生式中作为左部出现。

        P是一个产生式(production)的集合 产生式(重写规则、生成式):形如α→β的(α,β)有序对,且α∈V+,β∈V* ,其中 V = (VT∪VN) α称为产生式的左部,不能为空ε β称为产生式的右部,可以为空ε(如:A → ε )。

例1:文法 G = (VT,VN,S,P)               

VN = { S }                  

VT ={ 0, 1 }               

P = { S→0S1,  S→01 }

左部相同的产生式可以写在一起,如:  S →0S1 | 01

3  正规表达式

3.1单词符号的描述

        正规表达式是一个表示字符串格式的模式(pattern)。

        可以用来描述单词符号的结构。

        正规式(r)匹配的串集称为正规集(Regular Set),这是一个正规语言,记为L(r)

        正规式的运算( | 、连接、*、+)   —— 字符串集合(语言)的运算

        正规式运算的优先级关系(*和+、连接、| ),可以省略(和) 例如(a)|((b)*(c))—— a|b*c

          正规式的等价:不同算术表达式可以表示同一个数,如3+5、5+3、2+6等均表示8。不同正规式也可以表示同一个正规集,即正规式与正规集之间是多对一的关系。若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q。

例1 设字母表∑={a,b,c},则∑上的部分正规式和正规集如下:

正规式     对应正规集  

a,b,c     {a},{b},{c}

a|b , b|a     {a}∪{b}={a,b}

a(a|b)*     {a,aa,ab,aba,abb...},a为首的ab字符串

∑*        {ε,a,b,c,aa,abc,...}                            

例2 令 L(x)={a,b},L(y)={c,d},     

则 L(x|y)={a,b,c,d}  , L(y|x)={a,b,c,d}

 正规式的代数性质:

正规式的命名:    di→ri  其中di为正规式ri的名字

简化正规式描述

(a) 正闭包 :     r+ = rr* = r*r,r* = r+|ε

(b) 可缺省  :      r?=r|ε

(c) 字符组 :      枚举:   [abc],它等价于a|b|c      分段:   [0-9a-z]

(d) 非字符组  :      若 ∑={a, b, c, d, e, f, g},      则 L([^abc]) = { d, e, f, g

例1、以01结尾的二进制数串 :(0|1)*01 

例2、能被5整除的十进制整数: digit → [1-9]   digits → digit(digit|0)  *  digits(5|0)|0         

例3、不包含子串011的由01组成的符号串: 1*(01|0)* 

 例4、每个a后面至少紧随两个b的ab串 :  (abb|b)*

例5、C的形如/*…*/的注释,其中…不包含*/的字符串:  /*([^*]|*[^/])**/ 

 例6、合法的日期表示有如下三种形式,请给出描述日期的正规式。  

年.月.日,如1992.08.12  

日  月  年,如12  08 1992  

月/日/年,如08/12/1992


上篇:【编译原理】01引论

下篇:【编译原理】02词法分析(2) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》🌿《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🔰MT6701芯片和AS5600从软件读取对比,只是读取的寄存器和…

代码随想录算法训练营第56天| 583. 两个字符串的删除操作|72. 编辑距离|编辑距离总结篇

代码随想录算法训练营第56天| 583. 两个字符串的删除操作|72. 编辑距离|编辑距离总结篇 详细布置 583. 两个字符串的删除操作 本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思…

【Redis 神秘大陆】009 案例实践进阶

九、案例实践&进阶方案 9.1 本地缓存组件选型 使用缓存组件时需要重点关注集群方式、集群、缓存命中率。 需要关注集群组建方式、缓存统计;还需要考虑缓存开发语言对缓存的影响,如对于JAVA开发的缓存需要考虑GC的影响;最后还要特别关注…

SQL优化——核心概念

文章目录 1、基数(数据分布)2、选择性3、直方图(HISTOGRAM)4、回表(TABLE ACCESS BY INDEX ROWID)5、集群因子(CLUSTERING FACTOR)6、表与表之间关系 1、基数(数据分布) 某个列唯一键(Distinct…

springboot整合dubbo实现RPC服务远程调用

一、dubbo简介 1.什么是dubbo Apache Dubbo是一款微服务开发框架,他提供了RPC通信与微服务治理两大关键能力。有着远程发现与通信的能力,可以实现服务注册、负载均衡、流量调度等服务治理诉求。 2.dubbo基本工作原理 Contaniner:容器Provider&#xf…

[AI]-(第0期):认知深度学习

深度学习是一种人工智能(AI)方法,用于教计算机以受人脑启发的方式处理数据。 深度学习模型可以识别图片、文本、声音和其他数据中的复杂模式,从而生成准确的见解和预测。 您可以使用深度学习方法自动执行通常需要人工智能完成的…

【C++】set 类 和 map 类

1. 关联式容器 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key, value>结构的 键值对&#xff0c;在数据检索时比序列式容器效率更高 2. 键值对 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般只包含…

Pytorch(GPU版本)简介、安装与测试运行

目录 Pytorch简介Pytorch安装查看CUDA版本Pytorch命令安装Pytorch测试运行Pytorch简介 PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。 2…

Linux进阶篇:Centos7安装与配置mysql(rpm安装方式)

Linux服务搭建篇&#xff1a;Centos7安装与配置mysql&#xff08;rpm安装方式&#xff09; MySQL是一个开源的关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现在属于Oracle公司。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在WEB应用方面&am…

【架构-14】数据库性能优化方式

数据库出现性能瓶颈对外的表现为&#xff1a; 大量请求阻塞SQL操作变慢存储出现问题 为解决上述出现的问题&#xff0c;因此推出了一系列的数据库性能优化方式。 数据库性能优化是提高数据库系统性能和响应时间的关键任务。以下是一些常见的 数据库性能优化方式&#xff1a; …

锂电池充放电管理-单片机通用

锂电池充放电管理-单片机通用 一、锂电池充放电检测的原理二、power.c的实现三、power.h的实现四、锂电池检测和充电电路 一、锂电池充放电检测的原理 ①两节锂电池通过电阻分压检测ADC&#xff0c;再根据电压划分电量等级&#xff1b;②充电使用的是锂电池充电IC方案&#xf…

【问题解决分享】银河麒麟高级服务器操作系统oom分析

1.问题现象描述 服务器数据库被oomkill掉&#xff0c;但是mem查看只占用了不到60%。 2.问题分析 2.1.oom现象分析 从下面的日志信息&#xff0c;可以看到chmod进程是在内核采用GFP_KERNEL|__GFP_COMP分配order3也就是2的3次方&#xff0c;8个连续页的时候&#xff0c;因进入…

Hadoop大数据处理技术-安装配置篇

2024/4/16 ​Hadoop学习前的准备 1&#xff09;首先安装虚拟机 VMWare 虚拟机&#xff1a;因为它不是一个硬件 而是用软件做出来的 模拟真机 所以叫做虚拟机 但实际上它里面也可以安装Linux和Windows 实际它的实现 虚拟机中想要实现某个操作时 将需求发给Windows 调用Windo…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1…

OpenStack镜像管理与制作

一、OpenStack镜像服务 1、什么是镜像 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。虚拟机所使用的虚拟磁盘&#xff0c;实际上是一种特殊格式的镜像文件。云环境下尤其需要镜像。镜像就是一个模板&#xff0c;类似于VMware的虚拟机模板&#xff0c;其预先安装基本的…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作 要么同时成功&#xff0c;要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

计算机网络的七层模型

序 OSl(Open System Interconnect)&#xff0c;即开放式系统互联。一般都叫OSI参考模型。在网络编程中最重要的模型就是OSI七层网络模型和TCP/IP四层网络模型 一、OSI七层参考模型以及功能概述 二、各层的具体职能以及实际应用 1.应用层&#xff1a; OSI参考模型中最接近用…

【高端电流检测IC储能产品应用方案】耐压45V侧轨的电流检测芯片FP137 应用于电脑电源,开关电源以及多口快充充电器,户外移动电源,适配器,电池充电器等

近年来&#xff0c;随着电子产品的飞速发展&#xff0c;对电流检测精度和可靠性的要求也越来越高。特别是在电脑电源、开关电源以及多口快充充电器、户外移动电源、适配器、电池充电器等领域&#xff0c;对电流检测技术的需求更是日益增长。 电流检测芯片是一种关键的电子元器…

day02|最小花费爬梯子

最小花费爬梯子 比如 有一个数组 【2 5 20】我们直接选择从1号梯子&#xff08;从零编号&#xff09;跳两格就出去了。 算法原理 我们可以得出楼顶其实是数组的最后一个元素的下一个位置。对于最值问题我们可以尝试使用dpdp我们首先应该定义状态方差的含义&#xff0c;一般以…