【编译原理】语法制导翻译

news2024/7/6 17:38:31

1.导入

        语法制导翻译是处理语义的基本方法,它以语法分析为 基础,在语法分析得到语言结构的结果时,对附着于此结构 的语义进行处理,如计算表达式的值、生成中间代码等

2.语法与语义

        语法与语义的关系 语法是指语言的结构、即语言的“样子” ;语义是指附着于 语言结构上的实际含意 ,即语言的“意义” 。

对于语法和语义:

• 语义不能离开语法独立存在;

• 语义远比语法复杂;

• 同一语言结构可包含多种含意,不同语言结构表示相同含意;

• 语法与语义之间没有明确的界线。

3 基本概念

语义分析的作用:

        1,检查语言结构的语义是否正确,即是否构造正确的句子所表述的意思也合法

        2,执行所规定的语义动作,如表达式的值、符号表的填写、中间代码的生成等

1.语法制导翻译

        在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作

2.静态语义分析

        验证关于所编译的程序的语义规则是否全为“真”

3.语法制导定义SDD:

        SDD是对CFG的推广,他将每个文法符号和一个语义属性集合相关联,将每个产生式和一组语义规则相关联,这些规则用于计算该产生式种各个文法符号的属性值

        左边是上下文无关文法,右边是其对应的语义规则,T表示的是非终结符Type,它定义了一个属性type,当产生式右部是int时,T的值是int,是real时,T的值就是real。这里的L用来表示生成标识符序列inL,需注意,右边的L与左边的L是同一个符号,角标用来标识在表达式出现的位置

        5cb7d1400c9d4d89b5f411dc6d6b5236.jpeg

4.语法制导翻译方案SDT:

        在产生式右部嵌入程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作要放在花括号内。

        第一个语句动作表示当分析出T以后,我们就可以利用T的type值来计算L的inh值;第二三个式子表示当产生式右部都分析出来之后,我们就可以来计算产生式左部type值;最后一个表示在计算L1之前就可以根据L的inh值来计算L1的属性值

        一个语义动作在产生式中的位置决定了这个动作的执行时间。

1308c23166ec4673bb02a51d95999897.jpeg

补充:SDD和SDT

        SDD是关于语言翻译的最高层次规格说明,隐藏了许多具体的实现细节,使用户不必显示地说明翻译发生的顺序

        SDT可以看作是对SDD的一种补充,是SDD的具体实施方案,显示的指明了语义规则的计算顺序,以便说明某些实现细节

        应用最广的语义分析方法:语法制导翻译

        语法制导翻译:在语法分析过程中,随着分析(推导或者规约)的逐步开展,每识别出一个语法结构,根据文法的每个规则所对应的语义子程序进行翻译的方法。是使用CFG(上下文无关文法)来引导对语言的翻译,是一种面向文法的翻译技术

        语法制导翻译的基本思想:1.将文法符号所代表的语言结构的意思,用附着于该文法符号的属性表示(表示语义信息的方法:为CFG的文法符号设置语义属性);2. 用语义规则规定产生式所代表的语言结构之间的关系(即 属性之间的关系),即用语义规则实现属性计算(如何计算语义属性:语法福海的语义属性值是用与文法符号所在产生式即语法规则,相关联的语义规则来计算)

        对给定的输入串x,构建x的语法分析树,并利用与产生式(语法规则)相关联的语义规则来计算分析树各个节点对应的语义属性值

        语义规则的执行:在语法分析推导或归约的每一步骤中,执行 附着在对应产生式上的语义规则,实现对语义的处理,如查添 符号表、生成中间代码、发布错误信息等。

静态语义检查:

  • 类型检查
  • 控制流检查
  • 一致性检查
  • 相关名字检查
  • 名字的作用域分析

        审查每个语法结构的静态语义,即验证语法结构合法的程序是否有合法的意义 如果静态语义正确,生成中间代码或目标代码

4.SDD

        定义: SDD是对CFG的推广,他将每个文法符号和一个语义属性集合相关联,将每个产生式和一组语义规则相关联,这些规则用于计算该产生式种各个文法符号的属性值

        文法符号的属性:综合属性和继承属性       

综合属性:

        自下而上传递,综合属性的值由其子结点和其自身的的属性值确定。如产生式E->E1+T的语义规则是E.val=E1.val+T.val

继承属性:

        自上而下传递,继承属性的值由此结点的父结点或者兄弟结点的某些属性值确定

综合属性

        终结符可以具有综合属性。终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有建瓯算终结符属性的语义规则

        下面的图片中:digit是终结符,其综合属性值是由词法分析器提供的词法值lexval,圈起来的E表示的是expression表达式;通过第二三个语义规则可知,E的属性值是由它的子节点给的,同理,T和F也由其子节点决定,故三者都是综合属性

b7a82124b6eb42069400f9b5053dc147.jpeg

        语法分析树:每个节点都带有属性值的分析树

        9b7e694af7694337b27a5298b530dcd6.jpeg

继承属性 

        带有继承属性L.in的SDD:由第2 和3个式子可知,T.type的值是根据产生式右边即子结点决定的,根据第一条和第4条可知,L.inh值是由其兄弟(一起出现在产生式右边的字母)或父亲(产生式左边的值)给的;addtype是副作用,其中终结符的属性lexval是由词法分析器提供的,它表示构成终结符id的的字符序列,功能是在符号表当中创造一条记录,并且将id的类型设置为L.inh所表示的类型,由于使用了id自身的属性和子节点,所以该副作用可以理解为虚综合属性的一条语义规则

b764d66f1912497b98db788a98d4157c.jpeg

属性文法

        一个没有副作用的SDD有时也称之为属性文法,属性文法的规则仅仅通过其他属性值和常量来定义一个属性值

SDD求值顺序

        SDD为CFG的文法符号设置语义属性。对于给定的输入串x,应用语义规则计算分析树中各结点对应的属性值

        计算属性值的顺序思路:语义规则建立了属性之间的依赖关系,在对语法分析树节点的一个属性求值之前,必须首先求出这个属性值所依赖的所有属性值

依赖图

        依赖图:一个描述了分析树中结点属性间依赖关系的有向图

        依赖关系:若b依赖于c,则箭头从c指向b

6a032b76e2bc4d35a5954ccdf57d297a.jpeg

 

        属性计算顺序实现:被依赖的结点计算顺序在依赖的结点前面,这样排序就将一个有向图变成一个线性排序,这个排序称之为拓补排序

        对于只具有综合属性的SDD,可以按照任何自底向上的顺序计算他们的值

        对于同时具有综合属性和继承属性的SDD,不能保证存在一个顺序来对各个节点上的属性进行求值

        从计算的角度看,给定一个SDD,很难确定是否存在某棵语法分析树,使得SDD的属性之间存在循环依赖关系

        幸运的是,存在一个SDD的有用子类,他们能够保证对每一棵语法分析树都存在一个求值顺序,因为它们不允许产生带有环的依赖图

5 属性文法

基本概念:

        属性是描述语义的有效方法,由此发展而来的属性文法被人物为是上下文无关文法的扩充。

        但属性并不是描述语义的有效方法,特别是程序设计语言的动态语义(程序的运行时特性)并不适合用属性文法来描述

        上下文无关文法 + 语义规则

        即在上下文无关文法基础上,为每个文法符号配备若干相关的“值”(属性) 代表与文法符号相关信息,如类型、值、代码序列、符号表内容等等 根据语义规则,属性可以计算和传递

S-属性文法的自下而上计算

        S-属性定义:只含有综合属性的SDD称为S属性的SDD,或者S-属性定义、S-SDD

        可以在分析输入符号串的同时由自下而上的分析器来计算

        扩充LR分析器的功能:当执行归约产生式的动作时,也执行产生式对应的语义动作;

        扩充分析栈:增加一个与分析栈并列的语义栈,用于存放分析栈中文法符号所对应的属性值。

L-属性文法和自顶而下翻译

        L-属性定义(也称为L属性的SDD或L-SDD)的直观含义:在一个产生式所关联的各属性之间,依赖图的边可以从左到右,但不能从右到左(因此称为L属性的,L是left的首字母)。

        每个S-属性都是L-属性定义

      这类属性文法允许我们通过一次遍历就可以计算出所有属性值——树的深度优先遍历       

         如果对于每个产生式A→X1X2…Xn,其每个语义规则中的每个属性或者是综合属性,或者是Xj的一个继承属性且这个继承属性仅依赖于:         

        (1)产生式Xj的左边符号X1,X2,…,Xj-1的属性         

        (2)A的继承属性

反例:继承属性的倒数第一条,Q的值依赖于它右边符号R的属性值,故是非L属性的SDD

2281e288ed8e46f9922e03a22f36a6d4.jpeg

1-5 重点

297a103479f540949e2dd4024134cc0f.jpeg

98ae73d21c87448ea606bbdeea31f440.png

        综合属性(S-属性文法):自下而上传递 LR

        继承属性(L-属性文法):自上而下传递 LL(1)

7f86312584a240889a9fbf84dbfb4e28.png

6181adcc1bc8433c98610e6ff7326cb2.jpeg

7d4b493dff764f5eaf8f678c0246c1b2.jpeg

6 语法制导翻译方案SDT

        在产生式右部嵌入程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作要放在花括号内。

        SDT可以看作SDD的具体实施方案

主要讨论以下两种情况:

        基本文法可以使用LR分析技术,且SDD是S属性

        基本文法可以使用LL分析技术,且SDD是L属性

d6db15a8804746378a2d46f7d4cd1806.png

6bdd8114c2ae480991b498bf1e42bcd0.png

4af74448ada1437a87c22dd612082473.png

 

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

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

相关文章

html5+css简易实现图书网联系我们页面

html5css简易实现图书网联系我们页面 完整代码已资源绑定

PD虚拟机支持M3吗 PD虚拟机怎样配置图形卡

最近有很多人在问M3芯片的苹果电脑和M2相比,有哪些提升的功能。实际上,M3芯片的苹果电脑拥有与M2相同的CPU与GPU数量,但比M2多50亿个晶体管,并引入了动态缓存、增强型神经网络引擎等技术,性能、功能均进一步加强。面对…

【motan rpc 懒加载】异常

文章目录 升级版本解决问题我使用的有问题的版本配置懒加载错误的版本配置了懒加载 但是不生效 lazyInit"true" 启动不是懒加载 会报错一次官方回复 升级版本解决问题 <version.motan>1.2.1</version.motan><dependency><groupId>com.weibo…

Kotlin设计模式:享元模式(Flyweight Pattern)

Kotlin设计模式&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09; 在移动应用开发中&#xff0c;内存和CPU资源是非常宝贵的。享元模式&#xff08;Flyweight Pattern&#xff09;是一种设计模式&#xff0c;旨在通过对象重用来优化内存使用和性能。本文将深入探…

LabVIEW程序闪退问题

LabVIEW程序出现闪退问题可能源于多个方面&#xff0c;包括软件兼容性、内存管理、代码质量、硬件兼容性和环境因素。本文将从这些角度进行详细分析&#xff0c;探讨可能的原因和解决方案&#xff0c;并提供预防措施&#xff0c;以帮助用户避免和解决LabVIEW程序闪退的问题。 1…

STM32学习-HAL库 串口通信

学完标准库之后&#xff0c;本来想学习freertos的&#xff0c;但是看了很多教程都是移植的HAL库程序&#xff0c;这里再学习一些HAL库的内容&#xff0c;有了基础这里直接学习主要的外设。 HAL库对于串口主要有两个结构体UART_InitTypeDef和UART_HandleTypeDef&#xff0c;前者…

【CT】LeetCode手撕—56. 合并区间

目录 题目1- 思路2- 实现⭐56. 合并区间——题解思路 3- ACM 实现 题目 原题连接&#xff1a;56. 合并区间 1- 思路 模式识别&#xff1a;合并区间 ——> 数组先排序 思路 1.先对数组内容进行排序 ——> 定义 left、right 根据排序后的结果&#xff0c;更新 right2.遍…

Spring Boot整合Druid:轻松实现SQL监控和数据库密码加密

文章目录 1 引言1.1 简介1.2 Druid的功能1.3 竞品对比 2 准备工作2.1 项目环境 3 集成Druid3.1 添加依赖3.2 配置Druid3.3 编写测试类测试3.4 访问控制台3.5 测试SQL监控3.6 数据库密码加密3.6.1 执行命令加密数据库密码3.6.2 配置参数3.6.3 测试 4 总结 1 引言 1.1 简介 Dru…

如何处理消息积压问题

什么是MQ消息积压&#xff1f; MQ消息积压是指消息队列中的消息无法及时处理和消费&#xff0c;导致队列中消息累积过多的情况。 消息积压后果&#xff1a; ①&#xff1a;消息不能及时消费&#xff0c;导致任务不能及时处理 ②&#xff1a;下游消费者处理大量的消息任务&#…

品牌为什么需要3D营销?

在对比传统品牌营销手段时&#xff0c;线上3D互动营销以其更为生动的展示效果脱颖而出。它通过构建虚拟仿真场景&#xff0c;创造出一个身临其境的三维空间&#xff0c;充分满足了客户对实体质感空间的期待。不仅如此&#xff0c;线上3D互动营销还能实现全天候24小时无间断服务…

计量中的标准物是什么?仪器校准机构如何管理标准物?

计量标准中&#xff0c;标准物是常常使用的一种计量消耗品。为什么说是“消耗品”&#xff1f;因为大部分标准物都是使用就会磨损的&#xff0c;甚至不少标准物还是一次性的&#xff0c;并且这些标准物通常价格还不便宜&#xff0c;也是计量机构校准的主要成本之一&#xff0c;…

短距离无线连接“新”势力,移远通信再上新五款Wi-Fi与蓝牙模组

6月21日&#xff0c;在2024 MWC上海展前夕&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;推出代表其短距离通信技术的最新成果——覆盖Wi-Fi与蓝牙连接的五款模组新品。 该五款产品将通过稳连接、高可靠性、低功耗、多接口、高性价比等综合优势&…

基于STM32的智能环境监测系统

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通过使用STM32嵌…

uni-app系列:uni.navigateTo传值跳转

文章目录 1. 使用URL参数2. 使用页面栈注意事项&#xff1a;uni.navigateTo API 参数详细说明回调函数参数 在uni-app中&#xff0c;如果想要通过uni.navigateTo方法跳转到另一个页面并传递参数&#xff0c;可以使用页面路由的URL参数或者页面栈的方式来传递。但是&#xff0c;…

【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)

实现在CoppeliaSim环境中进行手眼标定和目标追踪的一个例子。它主要涉及到机器人、机器视觉和控制算法的编程&#xff0c;使用了Python语言。接下来对该代码的主要类和方法进行解析&#xff1a; 1. 导入相关库 用于与CoppeliaSim模拟器通过ZeroMQ接口通信。包含Rotation类&…

stm32单片机程序烧写方式ISP和IAP区别

在线编程目前有两种实现方法&#xff1a;在系统编程&#xff08;ISP&#xff09;和在应用编程&#xff08;IAP&#xff09;。 ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程&#xff0c;而IAP技术是从结构上将Flash存储器映射为两个存储体&#xf…

生鲜水果行业wordpress主题

水果蔬菜wordpress外贸自建站模板 水果、脐橙、牛油果、菠萝、凤梨、鲜枣、苹果、芒果、瓜果、百香果wordpress外贸独立站模板。 https://www.jianzhanpress.com/?p3932 生鲜wordpress外贸出口网站模板 水果、蔬菜、肉蛋奶、水产、干货等生鲜产品wordpress外贸出口公司网站…

手把手教你SpringBoot整合日志框架,并附录Log4j2的常用标签大全

前言&#xff1a; 日志是平时在项目中必不可少的东西&#xff0c;下面是SpringBoot3整合日志框架的一些基本要领&#xff0c;主要分为一下几步&#xff1a; 导入日志相关依赖配置日志相关功能实际使用日志 导入日志相关依赖 如果是SpringBoot项目&#xff0c;只要导入 spring-…

Elasticsearch的快照

ES的快照是什么&#xff1f; snapshot是一个ES集群或者某个指定索引的备份&#xff0c;快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本&#xff0c;依赖于可搜索的快照。-收费功能 一个快…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…