编译系统设计原理概述

目录

简介     

词法分析

正则表达式

有穷状态自动机

从正则表达式到有穷自动机的转换

单词识别


简介     

        主要介绍编译系统设计过程中涉及的原理与技术,主要分为前端设计和后端设计两 个模块。前端部分包括词法分析器、语法分析器的构建和语义分析过程的设计,后端部分包 括汇编生成目标文件以及链接生成可执行文件。

词法分析

         词法分析是编译器的首个阶段,它从左至右逐个读取输入源程序中的字符,并识别出单 个词素。词素的识别过程是字符串匹配的一种特殊情况,其中用到的基本原理最主要是正则 表达式(RegularExpression,RE)和有穷自动机(FiniteAutomata,FA)

正则表达式

正则表达式[26-28]是对字符串(包括普通字符和特殊字符)操作的一种符号表示法,其构 造方法和创建数学表达式相似,可作为模板用来匹配、过滤特定的字符串。从编程语言角度 上看,正则表达式的基本语法结构与过程式高级编程语言非常相似,主要有选择、连接和重 复(又称闭包)这三种基本操作。在一般的形式语言中,主要使用以下元字符来进行正则表 达式的构造:

(1)选择匹配。用‘|’来表示选择匹配,如x|y表示匹配x或y中的一个。

(2)重复限定。用来限定某个字符或子表达式出现的次数,最常用的有*、+、?、{n}等, 其中,‘*’号表示任意次匹配前面的字符或子表达式,‘+’号表示匹配前面的字符或子表 达式一次或多次,‘?’号表示匹配前面的字符或子表达式一次或零次,{n}表示匹配确定 的n次。如正则表达式a.*b可以匹配以a开头且以b为结尾的任意长字符串,即字符串acb、 azcdb 等均可匹配。

(3)范围限定。用‘[’和‘]’来限定匹配的字符范围,如[a-z]表示匹配字符‘a’到字符‘z’ 之间任意的小写字母。

(4)通配符。用‘.’来匹配除‘\n’与‘\r’之外的任意单个字符。

有穷状态自动机

有穷自动机描述的是一种数学模型,表示有限个状态在转移函数和有限输入条件下的状 态转移情况,被广泛的应用在各种各样的领域中,如设计数字电路的软件、词法分析的编译 器及通信协议中验证有穷状态等。有穷状态自动机又分为确定性有穷自动机(Deterministic FiniteAutomata,DFA)和非确定性有穷自动机(NondeterministicFiniteAutomata,NFA)。

DFA的下一状态由当前状态和当前输入字符唯一确定,自动机在读取输入字符后可转入到一 个确定状态,因此,称为确定性有穷状态机。而NFA在一个输入下存在多个下一状态,读取 输入字符后,自动机可从当前状态转移到其中任一状态,因此,称为非确定性有穷状态机。 DFA是一个带权有向图,图的节点表示状态,图的边表示自动机的状态变化情况,每条 边的权值表示从一个状态转换到另一个状态所需要的条件。DFA的形式化定义是一个五元 组

从正则表达式到有穷自动机的转换

虽然正则表达式能够进行字符串匹配,但若直接用正则表达式来解析字符串,不仅工作 量大,而且速度缓慢。因此,在进行词法分析器扫描程序的设计时,需要设计一种方法, 将正则表达式转化为计算机程序的模型,其中最常用的是Thompson构造法,它先将正 则表达式转换成NFA,再通过子集构造法从NFA构造出DFA,最终使用DFA进行单词识别。 如图2.1所示,构造一个词法分析器的扫描程序主要包含四步:首先根据C语言的特性 定义词法规则,然后采用正则表达式描述,再将正则表达式翻译成DFA,分别建立一个状态 转换图,构造词法分析器,完成最终的扫描程序。

单词识别

词法分析器的任务是将源程序字符流进行分割,将其分解为多个单词,每个单词都是一 个字符序列,表示源程序的相关信息。典型的单词主要有以下五种:

(1)关键字:如for和if等,它们是定长字符串,是程序语言中具有特殊含义的标识符。

(2)标识符:不定长字符串,由用户自行定义,根据C语言语法规则,C语言程序中的标识 符都是由字母、数字和下划线组成,且只能由字母和下划线开头。

(3)常量:数字型常量、字符型常量等。

(4)运算符:如+、−、×、÷等。

(5)界符:如{}、[]、()等。 在实际词法分析器的设计中,通常要求扫描程序向前搜索一个字符,这样能够保证在符 合词法定义的情况下,词法分析器识别的单词长度尽可能最大。也就是说,在满足C语言词 法定义的情况下,扫描器会一直向前读取字符,直到当前读入字符无法满足词法定义,即停 止扫描,保存识别的单词。

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

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

相关文章

ArcGIS Pro 车牌分区数据处理与地图制作全攻略

在大数据时代,地理信息系统(GIS)技术在各个领域都有着广泛的应用,而 ArcGIS Pro 作为一款功能强大的 GIS 软件,为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据&#xf…

前端登录鉴权全解析:主流方案对比与实现指南

文章目录 一、常见登录鉴权方式概览1.1 主流方案对比1.2 技术特性对比 二、Session/Cookie方案2.1 实现原理2.2 代码实现2.3 优缺点分析 三、JWT方案3.1 实现原理3.2 代码实现3.3 优缺点分析 四、OAuth方案4.1 实现原理4.2 代码实现4.3 优缺点分析 五、SSO方案5.1 实现原理5.2 …

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢?数独作为一款经典的逻辑游戏,其目标是在一个9x9的方格中填入数字1至9,确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单,但编写一个能够自动求解数独的程序…

华为hcia——Datacom实验指南——TCP传输原理和数据段格式

什么是TCP TCP是一种可靠的端到端的传输层协议,仅应用于单波通信。 采用TCP协议作为传输方式的应用层服务,再进行数据传输前,都需要进行TCP协议的创建。 TCP报文的格式 sequence number(序列号) 占4个字节&#x…

Vlog 片头制作

打开剪映,新建草稿,导入黑色背景。 拉长时间轴,背景时常调整为4.2秒。 添加文本,输入 5 个“|”,每个中间 2 个空格,如下| | | | |,然后手动放大文本,让中间显示出四个间隔。 继续添…

【Nacos】服务发布之优雅预热上线方案

目录 一、背景二、注册时机2.1、注册机制2.2、分析源码找到注册时机 三、注册前心跳健康检测3.1、方案实施3.2、源码分析3.3、优化代码 四、流量权重配置五、总结5.1、整体完整流程:5.2、流程图:5.1、优化方案完整代码: 一、背景 有些面向广…

VXLAN 组播 RP

一、Anycast RP 在每个 VTEP 上,每个多播组都会建立一个源树 (S,G),并且在双活 Leaf 设备上到 RP 地址是 ECMP 路径。 在 PIM ASM 模式下,(S,G) 组在 VTEP 端创建。由于每个 VTEP 都能够为特定的多播组发送和接收多播流量,因此每…

【第七节】windows sdk编程:Windows 中的对话框

目录 引言 一、对话框简介 1.1 对话框的创建 1.2 基本函数 1.3 模态对话框与非模态对话框 1.4 对话框与窗口的区别 二、模态对话框编程方法 2.1 模态对话框编程 2.2 消息框 三、非模态对话框编程方法 四、综合代码案例 引言 在Windows应用程序开发中,对话…

安装并配置终端字体

1. 简介 在使用 Oh My Zsh Powerlevel10k 时,正确的字体配置至关重要。Powerlevel10k 依赖 Nerd Fonts 扩展字体,以正确显示 Git 状态、分支、时间、图标等信息。 如果没有正确配置字体,你可能会看到 乱码、问号(?&#xff09…

LeetCode - #227 基于 Swift 实现基本计算器

摘要 在这篇文章中,我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式,并且遵循运算符的优先级规则。整数除法仅保留整数部分,不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…

智慧应急消防解决方案(35页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。在当今社会,消防安全至关重要,关乎人民生命财产安全和社会稳定。随着科技的飞速发展,智慧应急消防解决方案应运而生,为消防工作带来了新的变革和机遇。接下来,让我们深入探讨这份智…

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范,一方面是从思想意识上进行防范,另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面,纵观容易出现网络安全事故或者事件的公司和个人,在这些…

2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、…

11a-PPDU

## 前导码和信令 OFDM 物理层(PHY)的 PPDU(物理层协议数据单元)格式包含以下实体信息: - **PPDU 组成**:由 OFDM PHY preamble(前导码,12 个符号)、PHY header&#xff…

TF-IDF:文本挖掘中的关键词提取利器

引言 在自然语言处理(NLP)和文本挖掘中,TF-IDF是一种常用的技术,用于评估一个词在文档中的重要性。它不仅在信息检索领域广泛应用,还在文本分类、关键词提取等任务中发挥着重要作用。本文将详细介绍TF-IDF的原理…

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口(七孔),快充接口为直流充电口(九孔)。 引脚说明 上图给的是充电口的引脚图,充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…

docker3-容器与镜像命令

前言 容器命令[部分] docker run –name“nginx-lb” 这个就是为容器起一个名称 以前是随机起的名称 docker run -d --name mynginx1 nginx:1.24.0 docker ps 这样就可以看到我们起的名字了 docker stop mynginx1 这个就可以停掉指定名字的容器了,但不是删除…

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目,直接写一个vite的插件,通过这个插件可以动态注入环境变量,然后当打包的时候,自动注入这个时间到环境变量中,然后在项目中App.vue中或者Main.tsx中打印出来,这就知道是什么时候编译的项目了…

Linux中Gdb调试工具常用指令大全

1.gdb的安装 如果你是root用户直接用指令 :yum install gdb ;如果你是普通用户用指令:sudo yum install gdb; 2.gdb调试前可以对你的makefile文件进行编写: 下面展示为11.c文件编写的makefile文件: code…

go 安装swagger

1、依赖安装: # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入: swag -v 如果…