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

news2024/11/15 11:34:43

  • 第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^{*} x x x x 称为字母表 ∑ \sum 上的一个句子,其中 ε \pmb{ε} εεε 称作 ∑ \sum 上的空句子
  2. 字符a的出现 ∀ x , y ∈ ∑ ∗ , a ∈ ∑ \forall x,y \in \sum^{*}, a \in \sum x,y,a,句子 x a y xay xay 称为字符 a a a 在该句子中的一次出现

上下文无关文法

  1. 上下文无关文法 G 为一个四元组,即 G = ( V T , V N , S , P ) G = (V_T, V_N, S, P) G=(VT,VN,S,P),其中:
    V T V_T VT终结符集合(非空)
    V N V_N VN非终结符集合(非空),且 V T ∩ V N = ∅ V_T \cap V_N = \varnothing VTVN=
    S S S:文法的开始符号 S ∈ V N S \in V_N SVN
    P P P产生式集合(有限)
    每个产生式的形式为 P → α , P ∈ V N , α ∈ ( V T ∪ V N ) ∗ 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\gamma Aγ是一个产生式,且 α , β ∈ ( V T ∪ V N ) ∗ \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 ^{*}\alpha Sα,则 α \alpha α 是一个句型
    句子:仅含 终结符 的句型 是一个句子
    语言:文法 G 所产生的句子的全体 是一个 语言,记作 L ( G ) = { α ∣ S ⇒ + α , α ∈ V T ∗ } L(G) = \{\alpha | S\Rightarrow^{+}\alpha, \alpha \in V_T^* \} L(G)={αS+α,αVT}

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

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

相关文章

shiro

概述 shiro是什么 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 为…

批量数据导入Neo4j的方式

批量数据导入Neo4j的方式 文章目录批量数据导入Neo4j的方式1、写在前面2、前置芝士3、CSV数据导入Neo4j3.1 LOAD CSV Cypher命令3.2 neo4j-admin命令3.3 Kettle导入工具4、数据导入失败5、参考资料1、写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.04Neo4j版本&#xff1a;N…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、…

图的遍历(基础)

一、图的遍历的相关定义 遍历的定义&#xff1a;从已给的连通图中的某一顶点出发&#xff0c;沿着一些边访遍图中的所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算。遍历的实质&#xff1a;找每个邻接点的过程。图的特…

跌倒自动检测雷达的应用

跌倒是老人最常发生的意外之一&#xff0c;据统计&#xff0c;我国每年有150多万老人跌倒身亡。如何及时发现和预防老人跌倒以及避免可能发生的伤害事件&#xff0c;已成为目前社会关注的热点。美国加州大学伯克利分校研究人员研发出一种可穿戴设备——跌倒自动检测雷达&#x…

大规模MIMO通信系统的发射端采用混合波束成形附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

阅读笔记 DAGA 低资源标记任务数据扩充方法

阅读笔记 DAGA 低资源标记任务数据扩充方法 文章目录阅读笔记 DAGA 低资源标记任务数据扩充方法前言概述IntroductionBackground1、NER2、Part-of-Speech (POS) Tagging3、Target Based Sentiment AnalysisProposed Method1、Labeled Sentence Linearization2、Language Modeli…

c#入门-命名参数

位置参数 在你填入实参时&#xff0c;你填入的类型和顺序都需要和形参相同。 因为默认情况下&#xff0c;他是按照从左到右的顺序依次填入实参的。 命名参数 你在声明参数时给变量声明的名字是有用的。 在填入实参时&#xff0c;可以加上名字&#xff0c;以指定你填入的是哪…

触觉智能分享-低成本高性能的厨电解决方案

每个热爱生活的人&#xff0c;一日三餐四季&#xff0c;柴米油盐这点小事&#xff0c;都值得去享受&#xff0c;可如何学会做一顿美味可口的饭菜&#xff0c;对厨房小白来说可不是易事&#xff0c;智能菜谱的出现&#xff0c;将做菜的烹饪过程进行了分步拆解&#xff0c;同时将…

基于STM32波形信号发生器proteus仿真设计(仿真+程序+报告+讲解)

基于STM32波形信号发生器proteus仿真设计(仿真程序报告讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0075 讲解仿真视频&#xff1a; 基于STM32的波形信号发生器proteus仿真设计主要功能&#xff1a…

nessus无法导出报告(nessus转中文报告)

nessus漏扫报告&#xff0c;可是nessus导出的报告全是英文&#xff0c;客户说看不懂(说的好像中文就能看懂似的)。找了很多nessus转中文报告的工具都不是很靠谱&#xff0c;今天突然灵机一动发现了一个解决nessus无法导出报告方法。总的说来就是生产一个html文件转中文。 ness…

入门系列 - Git安装与配置

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

AI教你学测试

ChatGPT这个词相信大家最近看到都不会陌生&#xff0c;应该刷爆了各位的朋友圈&#xff0c;各种分享注册教程、什么AI写代码的文章比比皆是&#xff0c;今天&#xff0c;让我们一起来看一下OpenAI能不能教我们学测试呢&#xff0c;对测试人员的日常工作是否有帮助呢&#xff1f…

原生API编写简单富文本编辑器004

原生API编写富文本编辑器004 遗留的问题&#xff1a; 设置的字体是使用 font属性&#xff0c;而非CSS设置的字号只接受1-7, 并且是以 size 属性而非 CSS控制&#xff0c;超出大小无法设置。color使用HTML的input时&#xff0c;始终有一个input框在那里&#xff0c;并且如果手…

Oracle项目业务表单设计:Oracle PrimaveraUnifier BP

目录 基本介绍 Basic Introduction 业务流程组件 Business Process Components 数据定义 Data Definitions 数据要素 Data Elements 状态 Status 表单 Forms 工作流程 &#xff08;可选&#xff09;Workflow 日志 Log 上部表单 Upper Form 详细表单 Detail Form 行项…

找不到msvcr110dll,无法继续执行代码,解决方法分享

找不到msvcr110dll,无法继续执行代码&#xff0c;电脑出现这种情况&#xff0c;主要是缺失了msvcr110dll这个文件。 要解决这个问题&#xff0c;其实不难&#xff0c;有多种方法 第一种解决msvcr110dll的方法 1在百度搜索下载msvcr110.dll文件 2下载后将文件放在c盘windows…

Stimulsoft Dashboards.PHP 2022.4.5 Crack

Stimulsoft Dashboards.PHP 是一个用于设计和查看仪表板的完整软件包。您可以使用该工具集成到您的应用程序中或作为独立的解决方案。同时&#xff0c;不需要复杂的配置或第三方模块。您可以轻松地将仪表板集成到几乎任何 PHP 应用程序中。 仪表板设计器是一个直接影响分析面板…

【推荐学习收藏】9种回归算法及实例总结的太详细了

我相信很多人跟我一样&#xff0c;学习机器学习和数据科学的第一个算法是线性回归&#xff0c;它简单易懂。由于其功能有限&#xff0c;它不太可能成为工作中的最佳选择。大多数情况下&#xff0c;线性回归被用作基线模型来评估和比较研究中的新方法。 在处理实际问题时&#…

Web大学生网页作业成品——游戏主题HTM5网页设计作业成品 (HTML+CSS王者荣耀8页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

043-推箱子游戏源代码3

上一讲:042-推箱子游戏源代码2 摘要: 1、使用JAVA基础知识 2、GUI界面编程实现推箱子界面,常用控件的综合应用; 3、使用JAVA绘图技术实现推箱子过程的绘图功能; 4、使用键盘事件,通过方向键实现推箱子过程; 5、使用音频技术,实现播放背景音乐功能; 6、使用IO流技…