编译原理 1 - 概述、形式语言

news/2025/2/11 13:20:05/

  • 第1章 引论
    • 一些概念
    • 1.3 编译程序的总体结构
    • 1.4 编译程序的组织
  • 第二章 形式语言
    • 2.1 文法描述中的基本概念
    • 上下文无关文法


第1章 引论

一些概念

  1. 机器语言:以0、1代码表示的机器指令所构成的语言
    每一个具体的计算机系统都具有自己的指令系统

  2. 汇编语言:用助记符来表示指令中的操作与操作数,同时用符号表示程序用到的一系列数据

  3. 高级语言:C、C++、Java等

  4. 编译程序(Compiler):将源程序完整地转换成机器语言或者汇编语言程序,再处理、执行的翻译程序
    图(4)

  5. 解释程序(Interpreter):边解释边执行的程序
    在这里插入图片描述

  6. 翻译程序编译程序解释程序、汇编程序、交叉汇编程序、反汇编程序、交叉编译程序、反编译程序、可变目标编译程序、并行编译程序诊断程序编译程序优化编译程序

1.3 编译程序的总体结构

  1. 词法分析
    输入:组成源程序的字符串
    输出:单词序列(token)
    词法分析器的功能:从左到右扫描组成源程序的字符串,并将其转化成单词串,将发现的标识符登记到符号表中,检查组词方面的错误并进行处理
    在这里插入图片描述
  2. 语法分析
    输入:单词序列
    输出:这些单词所组成的程序的结构(不同层次的语法成分)
    语法分析器的功能:“组词成句”,分层给出程序的组成结构,指出语法错误制导语义翻译
    在这里插入图片描述
  3. 语义分析
    通常在语法分析器分析出语法成分的同时进行该语法成分的语义分析,即语法制导翻译(syntex-directed translation)
    语义分析通常以中间代码的形式表达相应的操作过程
    功能:1)获取标识符的属性:类型、作用域等; 2)语义检查:运算的合法性、取值范围等;
    3)子程序的静态绑定:代码的相对地址; 4)变量的静态绑定:数据的相对地址
    在这里插入图片描述
  4. 中间代码生成
    中间代码的形式实现对语义分析结果的表示
    特点:简单规范,与机器无关,易于优化和转换
    在这里插入图片描述
  5. 代码优化
    对中间代码进行优化处理,使程序运行能够尽量节省存储空间,更有效地利用机器资源,使得程序的运行速度更快,效率更高。(这种优化变换必须是等价的)
    分为 与机器无关的优化与机器有关的优化
  • 与机器无关的优化
    局部优化:
  1. 目标代码生成
    为中间代码中出现的运算对象分配存储单元、寄存器等
    将中间代码转换成目标机上的机器指令代码或汇编代码
    目标代码的形式={具有绝对地址的机器指令汇编语言形式的目标程序模块结构的机器指令(需要链接程序)目标代码的形式=\left\{ \begin{aligned}& 具有绝对地址的机器指令 \\ &汇编语言形式的目标程序 \\ &模块结构的机器指令(需要链接程序) \end{aligned} \right. =()

  2. 错误处理
    进行各种错误的检查、报告、纠正,以及相应的续编译处理(如:错误的定位与局部化)
    词法分析阶段:拼写方面的错误误,出现非法字符等
    语法分析阶段:表达式、句子或程序结构等错误
    语义分析阶段:类型匹配错误、参数匹配错误、非法转移问题等

  3. 符号表管理(表格管理)
    按照编译过程中的信息需求,以不同的类型组织符号表,并以合适的方式查、填、维护这些表格,提供信息服务,辅助实现编译任务

下图是编译程序处理赋值语句的翻译过程
在这里插入图片描述

1.4 编译程序的组织

通常称编译程序对源程序或中间结果的完整扫描为

第二章 形式语言

2.1 文法描述中的基本概念

  1. 字母表:一个非空有穷字符集,记作 ∑\sum
  2. 字符:字母表中的每个元素称为 字符
  3. ∑\sum 上的:由∑\sum中的字符所构成的一个有穷序列
  4. 空字 ε:不包含任何字符的序列
  5. ∑+\sum^{+}+:字母表∑\sum的正闭包,即∑+=∑∪∑1∪∑2∪...\sum^{+} = \sum\cup\sum^{1}\cup\sum^{2}\cup...+=12...
  6. ∑∗\sum^{*}:字母表∑\sum的Kleene闭包,即∑∗=ε∪∑∪∑1∪∑2∪...\sum^{*} ={\color{red}{ε}}\cup\sum\cup\sum^{1}\cup\sum^{2}\cup ...=ε12...

示例:若 ∑={0,1}\sum = \{0,1\}={0,1},则 ∑+={0,1,00,01,10,11,000,...}\sum^{+} = \{0,1,00,01,10,11,000,...\}+={0,1,00,01,10,11,000,...}∑∗={ε,0,1,00,01,10,11,000,...}\sum^{*} = \{{\color{red}{ε}},0,1,00,01,10,11,000,...\}={ε,0,1,00,01,10,11,000,...}

∑+\sum^{+}+∑∗\sum^{*} 的区别:
如果 ∑\sum 中不包含空字ε\pmb{ε}εεε,则 ∑∗\sum^{*} 中包含空字ε\pmb{ε}εεε,而∑+\sum^{+}+ 中不包含空字ε\pmb{ε}εεε

  1. 句子∀x∈∑∗\forall x \in \sum^{*}xxxx 称为字母表 ∑\sum 上的一个句子,其中 ε\pmb{ε}εεε 称作 ∑\sum 上的空句子
  2. 字符a的出现∀x,y∈∑∗,a∈∑\forall x,y \in \sum^{*}, a \in \sumx,y,a,句子 xayxayxay 称为字符 aaa 在该句子中的一次出现

上下文无关文法

  1. 上下文无关文法 G 为一个四元组,即 G=(VT,VN,S,P)G = (V_T, V_N, S, P)G=(VT,VN,S,P),其中:
    VTV_TVT终结符集合(非空)
    VNV_NVN非终结符集合(非空),且 VT∩VN=∅V_T \cap V_N = \varnothingVTVN=
    SSS:文法的开始符号S∈VNS \in V_NSVN
    PPP产生式集合(有限)
    每个产生式的形式为 P→α,P∈VN,α∈(VT∪VN)∗P \rightarrow \alpha, P \in V_N, \alpha \in (V_T \cup V_N)^{*}Pα,PVN,α(VTVN),读作 P 定义为 α\alphaα,P 是非终结符(也是被定义的句法单位),α\alphaα 是终结符和非终结符组成的串,利用了字符集上字的全体的记号
    规定:开始符号 S 至少在某个产生式的左部出现一次

示例:i 为 标识符(identifier),E 为 表达式(expression)。定义只包含 + 和 * 的算术表达式的文法 G=<{i,+,∗,(,)},{E},E,P>G = < {\color{red}{\{i, +, *, (, )\}}}, {\color{green}{\{E\}}}, {\color{blue}{E}}, P>G=<{i,+,,(,)},{E},E,P>,其中 P 由下列产生式组成:E → iE → E + EE → E * EE → (E),各产生式的意义为 一个表达式可以由一个标识符、或 两个表达式相加、或 两个表达式相乘、或 被括起来的表达式 这四种形式组成。

  1. BNF的产生式缩写
    E → iE → E+EE → E*EE → (E)
    可以缩写为 E → E | E+E | E*E | (E)
  2. 直接推导:称αAβ\alpha A\betaαAβ 直接推出 αγβ\alpha \gamma\betaαγβ,即 αAβ⇒αγβ\alpha A\beta \Rightarrow \alpha \gamma \betaαAβαγβ,仅当 A→γA\rightarrow\gammaAγ是一个产生式,且 α,β∈(VT∪VN)∗\alpha, \beta \in (V_T\cup V_N)^{*}α,β(VTVN)
    推导:若 α1⇒α2⇒...⇒αn\alpha _1 \Rightarrow \alpha _2 \Rightarrow ... \Rightarrow \alpha _nα1α2...αn,则称这个序列为 从 α1\alpha _1α1αn\alpha _nαn的一个推导
    若存在一个从 α1\alpha _1α1αn\alpha _nαn的一个推导,则 称 α1\alpha _1α1 可以推导出 αn\alpha _nαn
    对于 G(E):E → E | E+E | E*E | (E),想通过E 推导出 (i+i) ,则可以的做法是 E⇒(E)⇒(E+E)⇒(i+E)⇒(i+i)E \Rightarrow (E) \Rightarrow (E+E) \Rightarrow (i+E) \Rightarrow (i+i )E(E)(E+E)(i+E)(i+i)
    在这里插入图片描述

示例:每个确定的单词是一个终结符
在这里插入图片描述
分析
<主语><谓语><间接宾语><直接宾语> 是一个 句型
He gave me <直接宾语> 也是一个 句型
He gave me a book 是一个 句子 ,全都由 终结符 组成
可以看出,句型 是 对某些结构相同的句子 的抽象
所以 这个文法的开始符号本身 <句子> 也是一个句型,而且 句子都是句型,但句型不一定是句子

  1. 句型、句子、语言
    句型:假定 G 是一个文法,S 是 G 的开始符号。如果 S⇒∗αS \Rightarrow ^{*}\alphaSα,则 α\alphaα 是一个句型
    句子:仅含 终结符 的句型 是一个句子
    语言:文法 G 所产生的句子的全体 是一个 语言,记作 L(G)={α∣S⇒+α,α∈VT∗}L(G) = \{\alpha | S\Rightarrow^{+}\alpha, \alpha \in V_T^* \}L(G)={αS+α,αVT}

http://www.ppmy.cn/news/2745.html

相关文章

vue的script动态改css、scss变量方法

解决场景&#xff1a;script设颜色变量&#xff0c;<style>的background-color的值"#ddd"的跟着变 序 1、这篇博文适用vue2和vue3版本&#xff0c;博主实验时&#xff0c;vue3的版本是^3.2.45 2、 其实要解决的方案在vue3里有一个专栏“单文件组件的 <…

npm包是什么?如何发布npm包?

Node的组成 内置模块 自定义模块 第三方模块&#xff08;什么是包&#xff1f;&#xff09; npm包包括那些东西&#xff1f; package.json README.md 。。。.js 注册npm账号 细节 发布包 package.json README.md index.js date htmlEscape 层级结构 发布指令 N…

入门系列 - Git安装与配置

Git安装与配置 要使用Git&#xff0c;你必须在你的电脑上安装它。要不要使用并升级到最新的Git&#xff0c;那取决您的需要了。 下载Git 要下载Git安装程序&#xff0c;请访问Git的官方网站并进入下载页面。本文写于2022-11-29&#xff0c;此时您可以去官网链接去下载&#…

Linux下安装mysql5.7.18

查询mysql的安装文件&#xff1a; find / -name mysql有安装mysql的路径&#xff0c;有是存放MySQL安装包的路径 卸载mysql: 删除安装路劲 rm -rf /opt/mysql删除配置文件 rm -rf /etc/my.cnf删除/etc/init.d/下跟mysql有关的全部文件&#xff0c;一般包括mysql文件或mys…

Vue 使用socket.io实现聊天室

使用socket.io实现聊天室的实时通信功能。 安装socket.io:npm install socket.io在后端服务器中引入socket.io并启动服务器:const app = require(express)() const server = require(http).Server

canal+kafaka实现mysql与redis数据同步(centos7)

为什么不直接使用 canal 同步数据到redis中&#xff1f; 回答: 数据同步的代码和业务逻辑代码搅合在一起不方便维护。 目前cannal的最新版支持三种消息队列&#xff0c;kafka , rocketmq(有bug) rabbitMq 因此本文使用kafka作为mysql同步数据到redis的消息队列 kafka2.8以…

Python爬虫实战,Request+urllib模块,批量下载爬取飙歌榜所有音乐文件

前言 今天给大家介绍的是Python爬取飙歌榜所有音频数据并保存本地&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文 本数据爬取…

外汇天眼:什么是外汇动量交易?新手指南

1. 什么是动量交易&#xff1f; 我们需要了解的第一件事是动量到底是什么。势头是字面意义上的趋势强度。动量交易策略涉及仅在强劲的价格趋势方向开仓&#xff0c;利用持续的价格变动&#xff0c;并在趋势逆转之前退出。 动量交易者通常不会担心趋势在哪里结束和开始&#x…