目录

题型

总结

编译五大组成部分

编译与解释方式区别?

前端,后端,Why?

概念

推导、归约

短语、简单短语、句柄

文法

分类

正则文法(3型)

NFA、DFA、最小化

自上而下语法分析(推导)

判断是否是LL(1)文法

消除左递归

求FISRST集、FOLLOW集

FIRST

FOLLOW

预测分析法

构造预测分析表

自下而上语法分析

*自上而下分析法,也称为“移进-归约”法,其一般过程为:

算符优先分析法

算符文法:

FIRSTVT、LASTVT

算符优先文法

过程

素短语、最左素短语

LR分析法

基本思想:

语法制导翻译

中间代码的表示形式

三地址代码

四元式

三元式

三元式和四元式的比较:

间接三元式

语句的翻译while、if、数组

数组

if

while

符号表组织方式

运行时存储

嵌套过程语言的栈式实现

1.带有静态链的活动记录

2.带有Display的活动记录(小本)

优化

基本块

​编辑

循环


题型

判断5*2

选择10*2

简答3*5

综合5*11

总结

编译五大组成部分

更详细见【编译原理】一二章-CSDN博客

编译与解释方式区别?

编译是将源程序翻译成可执行的目标代码;不产生目标程序,边解释边执行

C语言和C++都是典型的编译型语言,它们的源代码需要被编译器完全编译成机器码才能执行。编译后生成的可执行文件直接在操作系统上运行,不需要虚拟机或解释器

Java比较特别,它需要编译成字节码,然后由JVM解释执行或者通过JIT编译执行。所以严格来说,Java是编译和解释混合型的。

Python通常被认为是解释型语言,代码由解释器逐行执行。不过现在也有像PyPy这样的实现使用JIT编译,或者将Python代码编译成字节码(比如.pyc文件)


编译程序:源语言为高级语言,目标语言为汇编语言或机器语言的翻译程序

解释程序:源语言程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。

编译方式 C C++
解释方式 数据库语言
python
解释
隐式编译为字节码.pyc
java
先编译成字节码,再通过JVM(java虚拟机)解释成目标程序

前端,后端,Why?

前端--与目标机无关的部分,与源语言有关

包括分析部分(词法、语法、语义分析)、中间代码生成与优化以及这部分的符号表管理错误处理

后端--与目标机有关的部分,不依赖源语言仅仅依赖于中间语言

包括代码生成、与目标机有关的优化以及这部分的符号表管理和错误处理工作

不同前端和不同后端相互配合可以得到不同的编译器

不同语言的前端可共享同一后端(如LLVM支持C、Rust、Swift)

跨平台


编译原理详解:前端后端划分、编译器可变目标机、高级语言执行方式-CSDN博客

前端主要由与源程序有关但与目标机无关的那些部分组成。这些部分通常包括词法分析、语法分析、语义分析与中间代码的产生,有些代码优化工作也可包括在前端。后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标机的生成等。
将编译过程划分成前端和后端,主要目的是在多种源语言和多种目标语言的开发过程中,可以灵活搭配组合,消除重复开发的工作量,提高编译系统的开发效率。

前端和后端的分离是为了提高系统的可维护性和可扩展性,同时也更好地分工合作

概念

【编译原理】一二章-CSDN博客

推导、归约

短语、简单短语、句柄

简单/直接短语:只有父子两代的子树

句柄:最左直接短语

文法

文法相关习题-CSDN博客

分类

0型(递归可枚举、图灵机)

1型(上下文有关)

2型(上下文无关文法)

3型(正规文法、线性文法)

语法分析

从源程序的第一个字符开始,从左到右扫描源程序, 一次读一个字符,根据词法规则将有关字符组合成单词, 并识别各类单词,当确定单词类别后,将单词输出。

正则文法(3型)

正则文法与状态转换图等价,是指正则文法所确定 的语言L(G),与状态转换图所接受的语言L(TG)相同:                          

L(G)=L(TG)

NFA、DFA、最小化

语法分析

按照文法从源程序单词串(符号串)中识别各类语法成分,判断所给出单词串是否是给定文法的正确句子,并为语义分析和代码生成做准备

自上而下语法分析(推导)

对于任一输入符号串,从文法的识别符号出 发,根据当前的输入符号,唯一确定一个产生式,用产 生式右部的符号串替代相应的非终结符往下推导,或构 造一棵语法树。若能推导出输入串或构造语法树成功则 输入串是句子,否则不是。

判断是否是LL(1)文法

 该文法满足确定的自上而下的分析方法, 其中,第一个L表明自左(Left)向右扫描输入串,第二个L表明分析过程采用最左(Left)推导,括号中的1表明只需向右看一个符号便可决定选择哪个产生式进行推导。

消除左递归

P=E        \alpha=+T        \beta=T

P=T       \alpha=*F        \beta=F

求FISRST集、FOLLOW集

FIRST

FOLLOW

预测分析法

预测分析程序是一种自顶向下分析程序,预测分析

要求文法是LL(1)文法,它由分析栈分析表分析程序 三部分组成,其中分析表的构成与文法有关。

构造预测分析表

自下而上语法分析

输入符号串开始,查找当前句柄,并用产生式将它归约成相应的非终结符,最后归约为开始符号

*自上而下分析法,也称为“移进-归约”法,其一般过程为:

(1)设置一个存放符号的栈称为符号栈,用于记录分析的过程和确定下一步的动作

(2)把输入符号串按扫描顺序逐个移进栈里(符号栈),当栈顶的符号组成的符号串形成一个句柄时(正好是某条产生式的右部),就进行归约。即把该符号串用与它对应的产生式左部的非终结符号代替,仍然置于栈顶

(3)接着检查新栈顶,若形成新的句柄,再进行归约,如没有形成新句柄,则从符号串种移进新的符号。如此重复,直到整个输入符号处理完毕为止

(4)若最终栈底为识别符号,则表明所分析的输入串合法,报告分析成功;否则是不合法的符号串,报告出错信息

注:

(1)对输入符号串的扫描,采用自左向右的顺序;

(2)分析过程是自下而上进行的(对语法树来说从末端    结点开始,最后归约到根结点);

(3)每次归约是对最左简单短语(句柄)进行的;

(4)算法的关键是确定最左简单短语。

算符优先分析法

算符优先分析法是自下而上分析方法中的一种, 虽然它不是规范(最左)归约,但它具有分析速度快,特别 适合表达式分析的特点,因而得到普遍应用。

A+B*C/D-E/F*G

算符文法:

任意产生式的右部不含有两个相继的非终结符

注:相继和相邻,相邻一定相继

FIRSTVT、LASTVT

假设有个产生式的一个候选形为

........aP........

对于任何b\inFIRSTVT(P),有a< \cdot b

假设有个产生式的一个候选形为

.......Pb.....

对于任何a\inLASTVT(P),有a\cdot > b

aP

Pa

ab

aPb

算符优先文法

设有一个不含空产生式算符文法(反应各终结符之间优先关系的优先关系矩阵),如果在任意两个终结符号之间,至多只有一种优先关系成立,则称这样的算符文法为算符优先文法 (Operator Precedence Grammar),即OPG文法。

过程

素短语、最左素短语

LR分析法

LR分析法是一种有效的自底向上的语法分析技术, 它能适用于大部分上下文无关文法的分析,一般叫 LR(k)分析方法,其中L是指自左(Left)向右扫描输入单 词串,R是指分析过程都是构造最右(Right)推导的逆过程(规范归约),括号中的k是指在决定当前分析动作时向 前看的符号个数。

基本思想:

在规范归约过程中,一方面记住以移进和归约出的整个符号串,即记住“历史”,另一方面根据所用的产生式推测未来可能碰到的输入符号,即对于未来进行“展望”

( 当一串貌似句柄的符号串呈现分析栈的顶端时,根据所记载的“历史”和“展望”以及“现实”的输入符号等三方面的材料,来确定栈顶的符号串是否构成相对某一产生式的句柄)

语法制导翻译

根据文法中每个产生式所蕴含的语义,为其配备一个(或多个)语法或子程序,对所要完成的功能进行描述,在语法分析过程中,当分析器使用该产生式进行语法分析时(无论是推导还是归约),除完成语法分析动作之外,还将调用为其配备的语义子程序,进行相应地语义处理,完成语义翻译工作

中间代码的表示形式

  • 后缀式
  • 图表示法(抽象语法树、DAG图)
  • 三地址码(三元式、四元式、间接三元式)

抽象语法树

DAG图

 DAG(Directed Acyclic Graph)无循环有向图,    与抽象语法树类似,但是在一个DAG中代表公共子表 达式的结点可有多个父结点

三地址代码

最基本的形式: x=y op z  

其中x、y、z为名字、常数或编译时产生的临时变量; op代表运算符号。每个语句的右边只能有一个运算符

四元式

三元式

三元式和四元式的比较:

相同点:

① 无论在一个三元式序列还是四元式序列中,各个三元式或四元式都是按相应表达式的实际运算顺序出现的

② 对同一表达式,所需三元式或四元式个数一般都是相同的

不同点:

① 由于三元式没有result字段,且不需要临时变量,故三元式比四元式占用的存储空间少

在进行代码优化处理时,在三元式中删去或移动运算的位置是很困难的,但四元式之间的相互联系是通过临时变量来实现的,所以影响就比较小

间接三元式

      建立两个与三元式有关的表格,一个称为三元式表, 用于存放各三元式本身;另一个称为执行表,它按照三 元式的执行顺序,依次列出相应各三元式在三元式表中 的位置,也就是说我们用一个三元式表连同执行表来表 示中间代码。通常我们称这种表示方法为间接三元式。

语句的翻译while、if、数组

【编译原理】语句的翻译_编译原理语句翻译-CSDN博客

数组

if

while

符号表组织方式

  • 线性表
  • 二叉树
  • 哈希(杂凑技术)

运行时存储

局部变量存放过程中的简单变量

内情向量存放数组变量

临时单元存放表达式计算的中间结果

形式单元存放实参的值或地址

--动态链 SP :函数调用关系,首地址

--静态链:外层、直接外层

嵌套过程语言的栈式实现

1.带有静态链的活动记录

2.带有Display的活动记录(小本)

Display表是栈式结构,从栈顶到栈底,分别存放本层及各外层的最新活动记录首地址

访问外层变量,只要知道该变量的层号,就可以在Display表中取到某个过程活动记录的首地址,来访问它局部数据区的数据

如何生成Display表?

全局Display存放主调过程的display表首地址

利用全局Display,找到主调过程的display表

利用主调过程的display表,来生成被调过程的display表

如何利用主调过程的display表,生成被调过程的display表?

P1的display表包括了P1以及P1的各个外层过程的最新活动记录的首地址

从主调过程display表里面,取i项,i是被调过程的层号,然后再添加上被调过程p2自己的基地址SP,就可以得到p2的display表

7全局display=2?

优化

基本块

  • 合并已知量

  • 交换语句位置
  • 代数变换



循环

  • 删除公共子表达式(多余运算)
  • 复写传播
  • 删除无用代码
  • 代码外提
  • 强度削弱
  • 删除归纳变量
  • 合并已知量

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

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

相关文章

【软考高级系统架构论文】论微服务架构及其应用

论文真题 论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic) 软件架构面临着越来越多的挑战,已逐渐无法适应互联网时代对软件的要求。在这一背景下,微服务架构模式(Microservi…

【人工智能】RAG分块

在RAG&#xff08;检索增强生成&#xff09;系统中&#xff0c;文档分块&#xff08;Chunking&#xff09;是决定系统性能的核心环节&#xff0c;直接影响检索精度和生成质量。分块需平衡语义完整性、检索效率和上下文保留三大目标。 一、分块的核心标准 1.1 分块基础知识​ …

能耗管理新革命:物联网实现能源高效利用

在全球能源危机与 “双碳” 目标的双重压力下&#xff0c;企业与社会对能耗管理的重视程度达到前所未有的高度。然而&#xff0c;传统能耗管理方式存在数据采集滞后、分析维度单一、节能措施粗放等问题&#xff0c;无法满足精细化管理需求。物联网技术凭借其强大的数据感知、传…

基于CMS的黄道吉日万年历源码(自适应)

本模板采用帝国cms7.5版UTF-8制作&#xff1b; 适用站点&#xff1a;时间查询、时差计算、万年历、黄道吉日查询、假期查询、节气表等&#xff1b; 源码优势&#xff1a;代码精简&#xff0c;利于SEO、UI大气精简&#xff0c;搜索引擎收录高&#xff1b; 全站伪静态无需刷新生成…

如何构建个人AIagent

构建个人AI Agent是一个结合技术实现和场景设计的系统工程&#xff0c;以下是分步骤的详细指南&#xff0c;涵盖从需求定义到部署落地的全流程&#xff1a; ​一、明确Agent定位&#xff08;关键第一步&#xff09;​​ ​角色定义矩阵​ 类型典型场景技术复杂度示例信息处理Ag…

lutris登录不进去

日志 Cannot create Vulkan instance.This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU thatdoes not support Vulkan.ERROR at /home/abuild/rpmbuild/BUILD/vulkan-tools-1.4.313-build/Vulkan-Tools-vulkan-sdk-1.…

缓存与加速技术实践-NoSQL之Redis配置与优化

目录 #1.1关系数据库与非关系型数据库 1.1.1关心型数据库 1.1.2非关系型数据库 1.1.3非关系型数据库产生背景 #2.1redis简介 2.1.1redis安装部署 2.1.2配置参数 #3.1redis命令工具 3.1.1redis-cli命令行工具 3.1.2redis-benchmark测试工具 #4.1redis数据库常用命令 4.1.1ke…

走近科学IT版:FreeBSD系统下ThinkPad键盘突然按不出b、n、/和空格键了!

走近科学IT版&#xff1a;FreeBSD系统下ThinkPad键盘突然按不出b和n键了&#xff01; 很慌&#xff0c;以为键盘坏了&#xff0c;在控制台无法按出b和n&#xff0c;但是在浏览器里&#xff0c;可以按出来。 重启机器&#xff0c;结果在浏览器里也按不出来了.... 按Ctrl空格&a…

聚铭网络入选嘶吼《中国网络安全细分领域产品名录》“云平台安全管理”与“态势感知”双领域TOP10

近日&#xff0c;在嘶吼安全产业研究院发布的《中国网络安全细分领域产品名录》中&#xff0c;聚铭网络凭借其核心产品——聚铭云端安全管家与聚铭安全态势感知与管控系统&#xff0c;分别入选“云平台安全管理”与“态势感知”两大关键细分领域TOP10榜单&#xff0c;充分展现了…

DEYOLO 全面复现,将双增强跨模态目标检测网络 DEYOLO 融合到 YOLOFuse 框架

模型架构模态精度 P召回率 RmAP50mAP50-95模型大小(MB)计算量(GFLOPs)yolov8n (baseline)RGB0.8880.8290.8910.5006.28.1yolo-fuse-中期特征融合RGBIR0.9510.8810.9470.6012.613.2yolo-fuse-早期特征融合RGBIR0.9500.8960.9550.6235.26.7yolo-fuse-决策级融合RGBIR0.9560.9050.…

python基于Django+mysql实现的图书管理系统【完整源码+数据库】

摘要 随着信息技术与教育现代化的深度融合&#xff0c;图书管理系统的智能化与自动化成为提升资源利用效率的关键需求。本文基于Python语言&#xff0c;采用Django框架与MySQL数据库设计并实现了一套功能完备的图书管理系统&#xff0c;旨在通过信息化手段优化图书借阅流程、强…

论软件设计方法及其应用

20250427-作 题目 软件设计&#xff08;Software Design&#xff0c;SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等&#xff0c;形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象&…

QT 自定义ComboBox,实现下拉框文本颜色设置

最近在做项目中遇到需求&#xff0c;在下拉框中&#xff0c;文本需要设置不同的颜色&#xff0c;遂网上了解了一番后&#xff0c;得出以下代码&#xff0c;可以完美实现效果&#xff0c;现分享出来&#xff01; 1.实现效果 2.自定义类 colorcombobox.h #ifndef COLORCOMBOBOX…

【时间戳】

在编程竞赛和高效数据处理场景中&#xff0c;时间戳技巧是一种极其高效的标记方法&#xff0c;常用于避免频繁清空数组或 map&#xff0c;提高算法运行效率。本文将从定义、应用场景、模板代码、技巧细节等方面系统整理时间戳的使用方式。 一、时间戳技巧是什么&#xff1f; 时…

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig)

有一次爬虫遇到了json的字符串响应对象 然后转为json对象 报这个错误 raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)", json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0) 意思是叫…

python训练day43 复习日

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader, random_split import matplotlib.pyplot as plt import numpy as np# 设置中文字体支持&#xff0c;避免绘图时中文…

C++11 lambda

前言 在Cpp11以前&#xff0c;为了把函数当作对象调用&#xff0c;可以使用C中的函数指针类型&#xff0c;也可以使用Cpp98的仿函数。 但二者都不是很好用&#xff0c;函数指针 return_type (*name)(parameters)的长相就令人望而却步&#xff0c;仿函数将一个函数重载为一个类…

【国产化-K8s】混合架构的 K8s + KubeSphere 部署指南

本文由 KubeSphere 社区贡献者 天行1st 编写。本文为作者实践总结。本文记录了在信创环境中基于混合架构&#xff08;x86 与 ARM64&#xff09;部署 Kubernetes 和 KubeSphere 的实践过程&#xff0c;覆盖多种国产 CPU 和操作系统&#xff0c;具有一定的参考价值。 环境涉及软…

利用python实现NBA数据可视化

大家好&#xff0c;今天我们利用python爬取NBA球星每年的比赛数据并进行可视化展示。主要用到三个模块&#xff1a;xpath、matplotlib。其中xpth负责爬取网站上的信息。Matplotlib是Python开发人员常用的Python绘图库&#xff0c;可以用来绘制各种2D图形&#xff0c;具有绘图质…

基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现

摘要 本研究针对传统医疗预约与诊断流程中存在的效率低下、信息不透明、患者等待时间长等问题&#xff0c;设计并实现了一个基于 SpringBootJSP 的医疗预约与诊断系统。系统采用 B/S 架构&#xff0c;整合了用户管理、科室管理、医生排班、预约挂号、在线问诊、检查检验、诊断…