编译原理-词法分析器

news2024/9/30 11:24:26

文章目录

  • 对于词法分析器的要求
    • 概念
    • 词法分析器的功能和输出形式
  • 词法分析器的设计
    • 词法分析器的`结构`
    • 单词符号的识别:超前搜索
    • 状态转换图
  • 正规表达式和有限自动机
    • 正规式和正规集
    • 确定有限自动机(`DFA`)
    • 非确定有限自动机(`NFA`)

对于词法分析器的要求

概念

  • 词法分析的任务:从左到右逐个字符地对源程序进行扫描,产生一个个单词符号
  • 词法分析器:又称扫描器,执行词法分析的程序

词法分析器的功能和输出形式

  • 功能:输入源程序,输出单词符号
  • 关键字:程序语言定义的具有固定意义的标识符,例如Pascal中的beginendifwhile
  • 标识符:表示各种名字:如变量名、数组名和过程名
  • 常数:整型、实型、布尔型、文字型。
  • 运算符:+、-、*、/
  • 界符:逗号、分号、括号
  • 输出的单词符号:(单词种别, 单词符号的属性值)
    • 单词种别:单词种别通常用符号编码表示
      image
  • 词法分析器在编译器中的地位
    image

词法分析器的设计

词法分析器的结构

image

  • 输入缓冲区:输入源程序文本,输入串放在一个缓冲区中,
  • 扫描缓冲区
    image
  • 预处理子程序主要的工作:剔除无用的空白、空格、换行、回车等字符
  • 扫描器:处理经过预处理子程序处理过的相对规整的字符串

单词符号的识别:超前搜索

  • 关键字的识别
    image
  • 标识符的识别:字母开头的字母数字串,后跟界符或算符
  • 常数识别:识别出算术常数并将其转变为二进制内码表示,有些也要超前搜索
  • 算符和界符的识别:把多个字符结合而成的算符和界符拼合成一个单一单词符合
  • 几点限制-不必使用超前搜索
    1.所有关键字都是保留字
    2.关键字作为特殊的标识符处理,都是用保留字表
    3.如果基本字、标识符、常量之间没有确定的运算符或界符做间隔,则必须使用一个空白符做间隔

状态转换图

  • 节点:代表状态,用圆圈表示
    image
  • 箭弧:状态之间用箭弧连接,箭弧上的标记代表射出结状态下可能出现的输入字符或字符类
    有限个状态必须有初态和终态
  • 状态转换图可用于识别一定的字符串:若存在一条从初态到某一终态的道路,且这条路上所有弧上的标记符连接成的字等于alfa,则称alfa为改状态转换图所识别。
    image
    image

正规表达式和有限自动机

正规式和正规集

image

  • 正规式:正规集的名字,当我们一看到正规式的时候就能想起来正规式对应的正规集
  • 正规集:真正的字集,可以理解为我们要研究的程序语言单词的集合就是正规集
  • 正规式等价:若两个正规式所表示的正规集相同,则认为二者等价

image

确定有限自动机(DFA

确定有限自动机是状态转换图的一种形式化表示
image

image
eg:
image
答案:B

我们考虑转换到状态1的条件:我们只有在接收到字符a的时候才会转换成状态1,而想要从状态1转换的状态3则必须要再接收一个字符a,考虑状态2,只有在接收到字符b的情况下才会转换到状态2,然后终态一定是以aa或bb结尾吗?我们看到终态还可以接收a|b转圈,所以一定不是以aa|bb结尾,但是要想从初态到终态,一定会经过1、2两个状态中的一个,所以一定会出现连续的aa|bb

image

ans:A
A:识别的是空串,从初态到终态可以一个字都不接收
B:识别的是空集

非确定有限自动机(NFA

NFADFA统称为有限自动机

  • 定义image
    下图是DFANFA的状态转换图
    image
    image

  • DFANFA的区别
    image
    DFANFA的转换:子集法

  1. 将初态唯一化
  2. 将弧上面的多个字符集|正规式变成单个字符
    image
  3. 将弧上的ε去掉、且做唯一化
    image

这一步是将弧上的ε去掉,这样我们把这些识别字相同的状态放在一起了,这样直接放在一起还会有一个问题就是他们还有自己的识别状态

image
经过a弧:严格意义上经过一个a弧,强调个数,再对J做ε闭包

I 和 Ia的关系:I和Ia都是一个状态,I经过若干个弧(第一个弧是a后面的弧都是ε)可以到达Ia,实际意义就是I识别一个a字符到达Ia,
这一步进行的意义是将状态之间的转换,变为状态集之间的转换,这样就有可能消除映射不是单值部分映射的问题

image

image

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

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

相关文章

多级缓存入门

文章目录 什么是多级缓存JVM进程缓存环境准备安装MySQL导入Demo工程导入商品查询页面 初识Caffeine Lua语法初识Lua第一个lua程序变量和循环Lua的数据类型声明变量循环 条件控制、函数函数条件控制 多级缓存安装OpenRestyOpenResty快速入门反向代理流程OpenResty监听请求编写it…

scrapy的安装和使用

一、scrapy是什么:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序 二、scrapy的安装:pip install scrapy -i https://pypi.douban.com/…

CURL简单使用

前言 最近做项目,需要服务器实现网络是否通畅,比如通过健康检查接口,但是只能linux服务器测试,很可能还需要测试h2,所以想到了curl,整理一版简单用法。 curl 实际上curl是有官网的,只不过比较…

java中的异常,以及出现异常后的处理【try,catch,finally】

一、异常概念 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的…

C语言-面试题实现有序序列合并

要求: a.输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 数据范围: 1≤n,m≤1000 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000 输入描述: 1.输入包含三行, 2.第一行包含两个正整数n, m&am…

Modbus协议详解4:RTU帧 ASCII帧的差错校验

前面已经分析过RTU帧和ASCII帧的报文区别,细心的朋友应该会发现在两种不同的报文传输模式下都有一个共同的组成部分——差错校验。 这个差错校验在RTU模式和ASCII模式下也不是不相同的。看下面的对比: RTU模式的差错校验: ASCII模式的差错校验…

对GRUB和initramfs的小探究

竞赛时对操作系统启动过程产生了些疑问,于是问题导向地浅浅探究了下GRUB和initramfs相关机制,相关笔记先放在这里了。 内核启动流程 在传统的BIOS系统中,计算机具体的启动流程如下: 电源启动:当计算机的电源打开时&…

CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置

写一个很简单的 c 代码,打印一些“地址”, 也就是变量、函数的“存储位置”:当程序被加载到内存后,它们具体是存在哪里,可以用精确的数值来表示,这就是内存地址。 https://godbolt.org/z/Ghh9ThY5Y #inc…

电解电容寿命与哪些因素有关?

电解电容在各类电源及电子产品中是不可替代的元器件,这些电子产品中由于应用环境的原因,使它成为最脆弱的一环,所以,电解电容的寿命也直接影响了电子产品的使用寿命。 一、电解电容失效模式与因素概述 铝电解电容器正极、负极引出…

Java实现ORM第一个api-FindAll

经过几天的业余开发,今天终于到ORM对业务api本身的实现了,首先实现第一个查询的api 老的C#定义如下 因为Java的泛型不纯,所以无法用只带泛型的方式实现api,对查询类的api做了调整,第一个参数要求传入实体对象 首先…

android——自定义控件(编辑框)、悬浮窗

一、自定义编辑框 效果图: 主要的代码为: class EditLayout JvmOverloads constructor(context: Context, attrs: AttributeSet? null, defStyleAttr: Int 0 ) : ConstraintLayout(context, attrs, defStyleAttr) {private var editTitle: Stringpr…

Android12 启动页适配

印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

Java中的CAS简述

目录 1、CAS是什么 2、CAS的生活化例子 3、Java中的atomic包 4、unsafe类 5、CAS的缺点及解决方案 小结 1、CAS是什么 CAS(Compare and Swap)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。它是一种乐观锁的实现方式&a…

分布式限流:Redis

目录 1:如何实现分布式限流 2:限流的几种类别 2.1:固定窗口限流 2.2:滑动窗口限流 2.3:漏桶限流 2.4:令牌桶限流 3:实现分布式限流:Redis 3.1:引入Redisson的依赖包 3.2:初始化Redisson 3.3:创建Redisson的限流类 1:如何实现分布式限流 1:把统计用户的使用频率等这些…

Springcloud介绍

1.基本介绍 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring …

欧拉图和哈密顿图

欧拉图 在连通图G中,经过G的每条边一次且仅一次的通路,称为欧拉通路若欧拉通路为回路,则称为欧拉回路含有欧拉回路的图称为欧拉图有欧拉通路则G可以一笔画出有欧拉回路则G是连通的且无奇点(欧拉图无奇点) 哈密顿图 …

2023了,是时候使用pnpm了!

2023了,是时候使用pnpm了! Excerpt 2023了,是时候使用pnpm了! 什么是pnpm pnpm代表performant npm(高性能的npm),同npm和Yarn,都属于Javascript包管理安装工具,它较npm和…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图,目前企业中有20个VLAN, 编号为VLAN1~VLAN20, 为了确保内部网络的可靠性,使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽,现管理员希望通过配置MSTP 的负载均衡实现网络带宽…

【proteus】8086 写一个汇编程序并调试

参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)p103-105,p119-122. 参考程序是p70,例4-1 在上一篇的基础上: 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图: …