编译原理-10-SDT

2024-03-15 18:10
文章标签 编译 原理 sdt

本文主要是介绍编译原理-10-SDT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sematics2-SDT

1. Definition (语法制导的翻译方案(Syntax-Directed Translation Scheme;SDT))

SDT是在其产生式体中嵌入语义动作的上下文无关文法。

  1. 语义动作可以嵌入在产生式体中的任何地方

上图中表示满足生成式后执行操作

  1. 上图中第2和4条表示先打印再匹配
  2. 前缀表达式SDT
    1. 语义动作嵌入的位置决定了何时执行该动作
    2. 基本思想: 一个动作在它左边的所有文法符号都处理过之后立刻执行

1.1. 时机

  1. Q:如何将SDD中的语义规则转换为带有语义动作的SDT

  1. Q:如何以三种方式实现SDT?

1.1.1. Offline 方式: 已有语法分析树

  1. 按照从左到右深度优先顺序遍历语法分析树
  2. 基本思想: 一个动作在它左边的所有文法符号都处理过之后立刻执行

1.1.2. 嵌入语义动作虚拟节点的语法分析树

语义动作也可以作为一个节点


  1. 基本思想:一个动作在它左边的所有文法符号都处理过之后立刻执行
  2. Q:是否所有的SDT都可以在LL/LR语法分析过程中实现

1.1.3. 该SDT无法在LL(1)/LR(1)中实现

  1. 前缀表达式SDT它需要在还不知道出现在输入中的运算符号是∗还是+时,就执行打印这些符号的操作

  1. Q::如何判断某SDT是否可以在LL/LR语法分析过程中实现?
  2. 将每个内嵌的语义动作A替换为一个独有的非终结符M,添加新产生式M→ε,判断新产生的文法是否可用LL/LR进行分析

1.2. 前缀表达式SDT

M 2 → ϵ M 4 → ϵ M 7 → ϵ \begin{array}{l} M2 \rightarrow \epsilon \\ M4 \rightarrow \epsilon \\ M7 \rightarrow \epsilon \\ \end{array} M2ϵM4ϵM7ϵ

M 2 → ⋅ , ( / d i g i t M2 \rightarrow ·,(/digit M2,(/digit是通过计算 F i r s t ( E ) First(E) First(E)得到的

2. SDT

2.1. 后缀翻译方案

  1. 后缀翻译方案:所有动作都在产生式的最后在LR中,按某个产生式归约时,执行相应动作

  1. 移入时,携带终结符的属性
  2. 归约时,计算A的属性值并入栈

2.2. L属性定义与LL语法分析

A → X 1 ⋅ ⋅ ⋅ X i ⋅ ⋅ ⋅ X n A \rightarrow X_1···X_i···X_n AX1XiXn

  1. 原则:从左到右处理各个Xi符号对每个Xi,先计算继承属性,后计算综合属性

2.3. 递归下降子过程 A → X 1 ⋅ ⋅ ⋅ X i ⋅ ⋅ ⋅ X n A \rightarrow X_1···X_i···X_n AX1XiXn

  1. 在调用 X i X_i Xi子过程之前,计算 X i X_i Xi的继承属性
  2. X i X_i Xi的继承属性为参数调用 X i X_i Xi子过程
  3. X i X_i Xi子过程返回之前,计算 X i X_i Xi的综合属性
  4. X i X_i Xi子过程中返回 X i X_i Xi的综合属性

X . x X.x X.x表示的是 X X X的综合属性,以此类推

2.4. 继承属性R.i用于计算并传递中间结果

  1. 先计算继承属性,再计算综合属性

原则:继承属性在处理文法符号之前,综合属性在处理文法符号之后

开始节点不可能有继承属性

3. L属性定义转换为SDT

A → X 1 ⋅ ⋅ ⋅ X i ⋅ ⋅ ⋅ X n A \rightarrow X_1···X_i···X_n AX1XiXn

  1. 计算 X i X_i Xi继承属性的动作放在产生式体中 X i X_i Xi左边
  2. 计算产生式头部 A A A综合属性的动作放在产生式体的最右边

这篇关于编译原理-10-SDT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建