编译原理-词法分析器

文章目录

  • 对于词法分析器的要求
    • 概念
    • 词法分析器的功能和输出形式
  • 词法分析器的设计
    • 词法分析器的`结构`
    • 单词符号的识别:超前搜索
    • 状态转换图
  • 正规表达式和有限自动机
    • 正规式和正规集
    • 确定有限自动机(`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.rhkb.cn/news/169554.html

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

相关文章

ThingsBoard的版本控制整合gitee

1、注册gitee账号,创建自己的空间,并且创建一个用于存储ThingsBoard相关的仓库 2、进入ThingsBoard的租户层,然后找到版本控制,进行配置 输入gitee的仓库地址 仓库URL:指定你的gitee的参考地址 仓库分支:master 身份验证:密码、访问令牌 用户名:登录账号 密码/访问令…

Leetcode 1089. 复写零

复写零 题目链接1089. 复写零 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。 注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回…

【QT】其他常用控件2

新建项目 lineEdit 什么都不显示(linux password) password textEdit和plainTextEdit spinBox和doubleSpinBox timeEdit、dateEdit、dateTimeEdit label 显示图案,导入资源:【QT】资源文件导入_复制其他项目中的文件到qt项目中_St…

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

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

整理MongoDB文档:身份验证

整理MongoDB文档:身份验证 个人博客,求关注。 文章概叙 本文主要讲MongoDB在单机状态下的账户配置。理解了MongoDB的语法,对于如何配置用户权限会知道怎么配置,但是请注意给谁配置什么权限才是最重要的。 最小权限原则 系统的每个程序或者…

宝塔部署nginx遇到的400错误和502错误

在部署express项目的过程中,由于我的代码有些变化,于是在宝塔面板上我又重新上传了一下我的项目,结果阴差阳错的被nginx反向代理配置不当引起的400错误request header or cokkie is too large和自己代码逻辑问题引起的502 bad gataway给绊倒了…

Springcloud介绍

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

springmvc视图格式——模板引擎freemarker输出HTML文本

目录 1. freemarker 介绍创建测试工程2.2.2) 配置文件2.2.3) 创建模型类2.2.4) 创建模板2.2.5) 创建controller2.2.6) 创建启动类2.2.7) 测试 2.3) freemarker基础2.3.1) 基础语法种类2.3.2) 集合指令(List和Map)2.3.3) if指令2.3.4) 运算符2.3.5) 空值处…

2023了,是时候使用pnpm了!

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

Arcgis 数据操作

在进行数据操作的时候,需要注意坐标系要一致,这是前提。 数据类型 文件地理数据库:gbd 个人地理数据库:mdb (Mircosoft Access) 矢量数据:shp 推荐使用gbd数据,效率会更高。 采…

“第六届世界声博会暨2023科大讯飞全球1024开发者节”开幕式回顾及舆情问题

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 2023年10月24日,笔者全程参加了在安徽合肥奥体中心举办的“第六届世界声博会暨2023科大讯飞全球1024开发者节”开幕式主论坛,下面来回顾一下。 一、会议简介 会议主题:“…

javaEE -8(9000字详解网络编程)

一:网络编程基础 1.1 网络资源 所谓的网络资源,其实就是在网络中可以获取的各种数据资源,而所有的网络资源,都是通过网络编程来进行数据传输的。 用户在浏览器中,打开在线视频网站,如优酷看视频&#xff…

Django学习笔记——文件上传(界面还怪好看得嘞)

定义文件上传函数 #文件上页面 def uploadFileIndex(request):return render(request, "uploadFile.html")#文件上传接口 def uploadFile(request):if request.method POST and request.FILES[file]:uploaded_file request.FILES[file]fs FileSystemStorage()# 选…

前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(二)

阳光总在风雨后,请相信有彩虹。 案例 - 图书管理 bootstrap弹框 需求,点击添加按钮,没有离开当前页面,在当前页面弹出弹框(弹窗) 先学着实现一个简单的弹框,如下图右下角 bootstrap有两种方式…

螺旋矩阵[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2&#xf…

Java在非spring项目中读取 .properties后缀的自定义配置文件生成map,用于jar包开发读取内部或者外部配置文件

文章目录 代码演示效果参考文档 代码 package com.test.ljj;import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.PropertyResourceBundle; import java.util.Set;public c…

Java反射获取内部类方法

Java反射获取内部类方法 结论一、案例准备二、测试方法:使用反射获取类的成员内部类和方法具体操作具体操作(使用getDeclaredClasses) 结论 Java 通过反射可以获得内部类,包括内部类属性信息和方法。 一、案例准备 创建了一个类…

vue3 elementPlus 表格实现行列拖拽及列检索功能

1、安装vuedraggable npm i -S vuedraggablenext 2、完整代码 <template> <div classcontainer><div class"dragbox"><el-table row-key"id" :data"tableData" :border"true"><el-table-columnv-for"…

迅为RK3568开发板RTMP推流之视频监控

1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块&#xff0c;是一个功能强大的流媒体服务器模块&#xff0c; 它提供了丰富的功能和灵活的配置选项&#xff0c;适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互…

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

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