编译原理学习之-一个简单的语法制导翻译器

第二章 一个简单的语法制导翻译器

将具有代表性的程序设计语言语句翻译为三地址码(一种中间表示形式),本章的重点是编译器的前端,特别是词法分析,语法分析和中间代码生产。
建立一个中缀算术表达式转换为后缀表达式的语法制导翻译器

{
  int i; int j; float[100] a;float v;float x;
  while(true){
     do j = i+1;while(a[i]<v);
     do j = j-1;while(a[j]>v);
     if(i>=j) break;
     x = a[i]; a[i] = a[j]; a[j] = x;
 }
}

引言

编译器在分析阶段把一个源程序划分成各个组成部分,并生成源程序的内部表示形式。这种内部表示称为中间代码。然后编译器在合成阶段将这个中间代码翻译成目标程序。
分析阶段的工作是围绕着待编译语言的“语法”展开的,一个程序设计语言的语法(syntax)描述了该语言的程序的正确形式,而该语言的语义(semantics)则定义了程序的定义,即每个程序在运行时组做什么事情,接下来将给出一个广泛使用的表示方法来描述语法,这个方法就是上下文无关文法或BNF(Backus-Naur范式)。使用现有的语义表示方法来描述一个语言的语义的难度远远大于描述语言的语法的难度。因此,将结合非形式化描述和启发性的示例来描述语言的语义。
上下文无关法不仅可以描述一个语言的语法,还可以指导程序的翻译过程。接下来将介绍面向文法的编译技术,即语法制导翻译(syntax-directed translation)技术,或者说语法分析。

从中缀表达式到后缀表达式的语法制导翻译过程,后缀表达式是一种将运算符置于运算符置于运算分量之后的表示方法。
编译器前端模型
词法分析器使得翻译器可以处理由多个字符组成的构造,比如标识符。标识符由多个字符组成,但是在语法分析阶段被当做一个单元进行处理。这样的单元被称为词法单元(token)
中间代码生成,一种被称为抽象语法树(abstract synta tree),或者简称语法树(syntax tree),它表示了 源程序的层次化语法结构.

2.2 语法定义

用于描述程序设计语言语法的表示方法–‘上下文无关文法’或者简称“文法”。
文法自然地描述了大多数程序设计语言构造的层次化语法结构,例如if-else语句。

if (express) statement else statement
//用expr表示表达式,变量struct表示语句
struct->if(expr)stmt else stmt

其中箭头(->)可以读作“可以具有如下形式”,这样的规则称为产生式(production)像if和括号这样的词法元素称为终结符号(terminal),像expr和stmt这样的变量表示终结符号的序列,它们称为非终结符号。

2.2.1文法定义

一个上下文无关文法(context-free grammar)由四个元素组成

  1. 一个终结符号集合,它们有时候被称为“词法单元”。终结符号是该文法所定义的语言的基本符号的集合;
  2. 一个非终结符号合集,它们有时候也被称为“词法变量”。每个非终结符号表示一个终结符号串的集合
  3. 一个产生式集合,其中每个产生式包括一个称为产生式或者左部的非终结符号,一个箭头,和一个称为产生式体或右部的由终结符号及非终结符号组成的序列。产生式主要用来表示某个构造的某种书写形式。如果产生式头非终结符号组成的序列,那么该产生式体就代表了该构造的一种书写形式。
  4. 指定一个非终结符号为开始符号
    词法单元和终结单元

在编译器中,词法分析器读入源程序中的字符序列,将它们组织成为具有词法含义的词素,生成并输出代表这些词素的词法单元序列。词法单元由两个部分组成:名字和属性。词法单元的名字是语法分析器在进行语法分析时使用的抽象符号,我们常常把这些词法单元名字称为终结符号,因为他们在描述程序设计语言的文法中是以终结符号的形式出现的。如果词法单元具有属性值,那么这个值就是一个指向符号表的指针,符号表中包含了该词法单元的附加信息,这些附加信息不是文法的组成部分,因此在我们的讨论语法分析时,通常将词法单元和终结符号当做同义词。

以非终结符号list为头部的三个产生式可以等价地组合为:
list->list + digit|list - digit|digit

2.2.2 推导

根据文法推导符号串时,首先从开始符号出发,不断将某个非终结符号替换为该非终结符号的某个产生式的体。可以从开始符号推导得到的所有符号终结符号串的集合称为该文法定义的语言(language)。

语法分析(parsing)的任务是:接受一个终结符号串作为输入,找出从文法的开始符号推导出这个串的方法。如果不能从文法的开始符号推导得到该终结符号串的方法。如果不能从文法的开始符号推导得到该终结符号串,则报告该符号串中包含的语法错误。

2.2.3 语法分析树

语法分析树用图形方式展现了从文法的开始符号推导出相应语言中的符号串的过程。
给定一个上下文无关法,该文法的一颗语法分析树(parse tree)是具有以下性质的树:

  1. 根节点的标号为文法的开始符号;
  2. 每个叶子结点的标号为一个终结符号或e;
  3. 每个内部结点的标号为一个非终结符号;
  4. 如果非终结符号A是某个内部结点的标号,并且它的子结点的标号从左到右分为为X1,X2…Xn

关于树形结构的术语

树形结构在编译系统中起着重要的作用。

  • 一棵树由一个或者多个结点组成。结点可以带有标号(label)
  • 树有且只有一个根(root)节点。每个非根节点都有唯一的父(parent)节点。根结点没有父节点。
  • 如果节点N是结点M的父节点,那么M就是N的子结点(child)结点,一个结点的各个子结点彼此被称为兄弟(sibling)节点。它们之间是有序的,按照从左往右的方式排列
  • 没有子结点的节点称为叶子(leaf)节点,其他节点,即有一个或者多个子结点的节点,称为内部节点(interior node);
  • 节点N的后代(descendent)结点要么是结点N本身,要么是N的子结点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3.3 ss-sp寄存器,栈的push和pop指令

汇编语言 1. 栈 栈是一种具有特殊的访问方式的存储空间它的特殊性就在于&#xff0c;最后进入这个空间的数据&#xff0c;最先出去。即先进后出 1.1 栈的基本操作 入栈&#xff1a;入栈就是将一个新的元素放到栈顶出栈&#xff1a;出栈就是从栈顶取出一个元素栈顶的元素总是…

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)1. 各种变换的关系2. 变换公式3. 2D变换的层次4. python实现 一、向量和矩阵的基本运算 【计算机视觉】二、图像形成&#xff1a;1、向量和矩阵…

工业物联网平台在水务环保、暖通制冷、电力能源等行业的应用

随着科技的不断发展&#xff0c;工业物联网平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为推动各行业智能化转型的关键力量。在水务环保、暖通制冷、电力能源等行业&#xff0c;工业物联网平台的应用尤为广泛&#xff0c;对于提升运营效率、降低能耗、优化管理等…

【C++设计模式】UML图的介绍及其画法

文章目录 前言一、UML图的介绍1.1 UML图是什么1.2 UML图的作用 二、UML图的画法2.1 最简单的UML图2.2 继承的UML图2.3 关联关系2.4 聚合关系2.5 组合关系2.6 依赖关系 总结 前言 在软件开发过程中&#xff0c;设计模式是一种被广泛应用的方法&#xff0c;它为解决特定问题提供…

利用数据驱动的MEG分析方法提取fMRI静息态网络

摘要 静息态网络(RSN)的电生理基础仍存在争议。特别是&#xff0c;尚未确定一个能够同样有效解释所有静息态网络的原理性机制。虽然脑磁图(MEG)和脑电图(EEG)是确定RSN电生理基础的首选方法&#xff0c;但目前没有标准的RSN分析流程。本文比较了从MEG数据中提取RSNs的两种现有…

Profinet转CC-Link网关操作技巧及功能

Profinet转CC-Link网关&#xff08;XD-PNCR20&#xff09;是一款可有效连接CCLINK总线和Profinet网络的通讯网关。Profinet转CC-Link网关主要功能是将各种CCLINK总线和Profinet网络连接起来&#xff0c;实现各种总线的互联通信。 Profinet转CC-Link网关连接到Profinet总线中做…

电源常用通讯电路详解

数字电源的采样和PWM驱动电路原理&#xff0c;通过这些技术&#xff0c;数字电源可以在内部形成控制闭环。但是要实现电源的控制和管理&#xff0c;还是需要与数字控制核心建立通讯连接。本期将带领大家了解数字电源常用的通讯电路。 一、常用的通讯方式 在前面数字电源与模拟…

Could not transform the global plan to the frame of the controller

报错&#xff1a; [ERROR] [1710509295.679888409, 296.695000000]: Extrapolation Error: Lookup would require extrapolation 0.003000000s into the future. Requested time 295.747000000 but the latest data is at time 295.744000000, when looking up transform from…

详解C++运算符重载

目录 运算符重载 1.运算符重载概念的回顾 2. 运算符重载 3. < 运算符重载 4. 赋值运算符 4.1赋值运算符和拷贝构造的区别 4.2赋值运算符重载格式 4.3 默认赋值重载 运算符重载 1.运算符重载概念的回顾 C为了增强代码的可读性引入了运算符重载&#xff0c;运…

力扣题目训练(21)

2024年2月14日力扣题目训练 2024年2月14日力扣题目训练605. 种花问题617. 合并二叉树628. 三个数的最大乘积289. 生命游戏299. 猜数字游戏149. 直线上最多的点数 2024年2月14日力扣题目训练 2024年2月14日第二十一天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…

fortran,进坟墓了吗?新型快速开发工具突现,该何去何从?

在C、Python等流行语言风头正劲的时候&#xff0c;Fortran对于新一代开发者而言&#xff0c;却显得陌生甚至闻所未闻。 然而&#xff0c;Fortran作为计算机领域首个被广泛推广的高级语言&#xff0c;自1956年诞生至今已逾60载&#xff0c;承载着无数程序员的青春记忆。 在许多…

蓝桥杯 - 大石头的搬运工 C++ 前缀和 算法 附Java python

题目 思路和解题方法 这段代码的目标是计算给定点集的最小总移动成本&#xff0c;使得所有点都在同一直线上。它通过计算每个点左边和右边的移动成本&#xff0c;然后在所有可能的分割点中选择最小成本。具体步骤如下&#xff1a; 读取输入的点集&#xff0c;每个点表示为 (y, …

十三、项目相关方管理

十三、项目相关方管理 1、项目相关方管理 ​ 识别相关方是定期识别相关项目方&#xff0c;分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响的过程。 ** 1.1 关键技术 数据表现 相关方分析会产品相关方清单和关于相关方的各种信息&#xff0c;例如…

【机器学习】走进监督学习:构建智能预测模型的第一步

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

沃通SSL证书证券行业应用案例

金融证券行业作为现代经济体系中的重要组成部分&#xff0c;其安全性直接关系到国家经济的稳定和广大投资者的利益。沃通SSL证书基于密码技术保护传输数据的机密性、完整性&#xff0c;通过权威身份认证确保服务器身份真实性&#xff0c;已持续为众多知名证券行业客户提供服务&…

【图像分类】基于深度学习的人脸表情识别(开心、悲伤、生气三个类别,ResNet网络)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?

在当今的互联网架构中&#xff0c;BGP(边界网关协议)线路服务器和BGP机房扮演着至关重要的角色。BGP作为一种用于在自治系统(AS)之间交换路由信息的路径向量协议&#xff0c;它确保了互联网上的数据能够高效、准确地从一个地方传输到另一个地方。那么&#xff0c;究竟什么是BGP…

sklearn.model_selection.learning_curve的详细介绍(包含ShuffleSplit()介绍)

提示&#xff1a;sklearn.model_selection.learning_curve的详细介绍 文章目录 1、需求分析2、learning_curve主要输出参数3、learning_curve主要参数4、learning_curve作用5、learning_curve代码6、ShuffleSplit&#xff08;&#xff09; 1、需求分析 通过参数train_size选取…

OJ_点菜问题(背包问题)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;int main() {int c, n;scanf("%d%d", &c, &n);int p[101];int v[101];for (int i 0; i < n; i){scanf("%d%d", &p[i],…

深入探讨MES管理系统与MOM系统之间的关系

在制造业的信息化浪潮中&#xff0c;各种系统与技术层出不穷&#xff0c;其中MES制造执行系统和MOM制造运营管理无疑是备受瞩目的两大主角。尽管它们都是制造业信息化不可或缺的部分&#xff0c;但许多人对它们之间的区别与联系仍感到困惑。本文将对MES管理系统和MOM系统进行深…