编译原理完整学习笔记(五):属性文法和语法制导翻译

2023-11-01 19:31

本文主要是介绍编译原理完整学习笔记(五):属性文法和语法制导翻译,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。

文章目录

    • 前言
    • 属性文法和语法制导翻译
      • 一、概述
        • 1.1 综合属性
        • 1.2 继承属性
        • 1.3 语义规则
      • 二、带注释的语法树
        • 2.1 S-属性文法
        • 2.2 L-属性文法
      • 三、属性计算
        • 3.1 概述
        • 3.2 语法制导翻译法
        • 3.3 依赖图
          • 3.3.1 构建算法
          • 3.3.2 依赖图举例
          • 3.3.3 属性的计算次序
        • 3.4 树遍历
          • 3.4.1 树遍历算法
          • 3.4.2 树遍历举例
        • 3.5 一遍扫描
          • 3.5.1 抽象语法树
          • 3.5.2 建立抽象语法树
          • 3.5.3 一遍扫描举例
    • 资料来源


属性文法和语法制导翻译

一、概述

属性文法,也称为属性翻译文法,以 “上下文无关文法” 为基础,扩充了以下两部分内容:

  • 每个文法符号(终结符或非终结符)有 “值”(属性)
  • 每个产生式有一组属性的语义规则,对属性进行计算和传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Rc3D5XP-1597633504396)(media/15892523842959.jpg)]

属性中有两类属性,一种是综合属性,另一种是继承属性。

1.1 综合属性
  • 自下而上传递信息
  • 语法规则:产生式右部确定左部

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DUdISAo-1597633504400)(media/15892526840515.jpg)]

  • 语法树:子节点确定父节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRTKo3d6-1597633504403)(media/15892527144167.jpg)]

1.2 继承属性
  • 自上而下传递信息
  • 语法规则:产生式左部确定右部

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AE7vVOgJ-1597633504404)(media/15892528247818.jpg)]

  • 语法树:(父节点 + 兄弟节点)确定(子节点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0dtDFui-1597633504405)(media/15892528777996.jpg)]

1.3 语义规则

产生式 A → α A\rightarrow \alpha Aα 对应的语义规则如下:
b : = f ( c 1 , c 2 , . . . , c k ) b:=f(c_1,c_2,...,c_k) b:=f(c1,c2,...,ck)
其中共有两种情况:

  • b 是 A 的综合属性, c i c_i ci 是产生式右边文法符号的属性
  • b 是产生式右边文法符号的继承属性, c i c_i ci 是 A 或产生式右边文法符号的属性

由此可以如下结论:

  • 终结符只有综合属性,且由词法分析器提供
  • 非终结符可以有综合属性、继承属性
  • 文法开始符号的所有继承属性作为属性计算前的初始值

语义规则功能:

  • 属性计算、静态语义检查
  • 符号表操作、代码生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QMpMOGZt-1597633504405)(media/15892538453566.jpg)]

二、带注释的语法树

2.1 S-属性文法
  • 语法树中,一个结点的综合属性的值由其子结点和它本身的属性值确定
  • 使用自底向上的办法在每一个结点处使用语义规则计算综合属性的值
  • 仅使用综合属性的属性文法为 S-属性文法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y9juqgUB-1597633504406)(media/15892612853527.jpg)]

  • 分析过程
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fiAx0561-1597633504406)(media/15922112717264.jpg)]
2.2 L-属性文法

语法树中,结点的继承属性由其父结点、其兄弟结点和其本身的某些属性确定。

  • 继承属性,常用于表示上下文依赖关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZqkIJiZ-1597633504407)(media/15892613875832.jpg)]

  • 文法定义
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxF5IKBZ-1597633504407)(media/15922111699746.jpg)]

三、属性计算

3.1 概述

语义规则的计算功能如下:

  • 产生代码
  • 在符号表中存放信息
  • 给出错误信息
  • 执行任何其它动作

「总结」对输入串的翻译就是根据语义规则进行计算。

3.2 语法制导翻译法

语法制导翻译法:由源程序的语法结构所驱动的处理办法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VtEANdJK-1597633504408)(media/15892618009527.jpg)]

基于属性文法的处理方法有:

  • 依赖图
  • 树遍历
  • 一遍扫描
3.3 依赖图

「功能」描述一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系

3.3.1 构建算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnBbGeUT-1597633504409)(media/15892650094231.jpg)]

3.3.2 依赖图举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYfjWGSG-1597633504410)(media/15892650332609.jpg)]

  • 如果一属性文法不存在属性之间的循环依赖关系,则该文法为良定义的
  • 一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序
3.3.3 属性的计算次序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbFq3X9o-1597633504410)(media/15892651743803.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWiDTh0D-1597633504411)(media/15892652559998.jpg)]

3.4 树遍历

「具体方法」通过树遍历的方法计算属性的值

  • 输入时,树中已有开始符号的继承属性和终结符的综合属性
  • 深度优化,从左到右的遍历

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N7aQHHoJ-1597633504411)(media/15892661489408.jpg)]

3.4.1 树遍历算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kEnNcQOF-1597633504412)(media/15892661947124.jpg)]

3.4.2 树遍历举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nddjpMjX-1597633504413)(media/15892662280687.jpg)]

3.5 一遍扫描
  • 在语法分析的同时计算属性值
  • 适用于 S-属性文法 / L-属性文法
3.5.1 抽象语法树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-brxGPTNM-1597633504413)(media/15892669752285.jpg)]

3.5.2 建立抽象语法树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qb93KAzu-1597633504414)(media/15892670047060.jpg)]

3.5.3 一遍扫描举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60ZsNJX6-1597633504414)(media/15892670363976.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFMg1ITC-1597633504415)(media/15892670653695.jpg)]


资料来源

  • 编译原理 - 国防科技大学 - MOOC

这篇关于编译原理完整学习笔记(五):属性文法和语法制导翻译的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325240

相关文章

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Java利用Spire.XLS for Java自动化设置Excel的文档属性

《Java利用Spire.XLSforJava自动化设置Excel的文档属性》一个专业的Excel文件,其文档属性往往能大大提升文件的可管理性和可检索性,下面我们就来看看Java如何使用Spire... 目录Spire.XLS for Java 库介绍与安装Java 设置内置的 Excel 文档属性Java

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过