当前位置: 首页 > article >正文

【从零开始学习计算机科学】编译原理(五)语法制导翻译

【从零开始学习计算机科学】编译原理(五)语法制导翻译

  • 语法制导翻译
    • 语法制导定义SDD
      • SDD的求值顺序
        • 两类重要的SDD
    • 语法制导的翻译方案SDT
      • SDT的实现
        • L属性定义的SDT
      • 左递归翻译方案

语法制导翻译

语法表述的是语言的形式,或者说是语言的样子和结构。而程序设计语言中另一方面,是附着在语言结构上的语义;语义揭示了程序本身的涵义、施加于语言结构上的限制、要执行的动作。

语法制导翻译就是如何在语法上绑定语义。语法制导翻译是目前最常用的语义分析技术,具体包括两种标记方法:语法制导定义(Syntax-directed definitions)SDD和语法制导的翻译方案(Syntax-directed translation scheme)SDT。

语法制导定义SDD

语法制导翻译的基本思想是在上下文无关文法的基础上,将语言结构的语义以属性的形式赋予代表此结构的文法符号。其属性的计算以语义规则的形式赋予由文法符号组成的产生式。属性可以代表任何对象:字符串、数字、内存单元或其它对象。

例如,对于文法:

E → \to E 1 E_1 E1+T

E → \to T

T → \to F

F → \to digit

假设F.val、T.val、E.val分别为文法符号F、T、E的属性值。digit.lexval为文法符号digit的属性:当digit为常数时,digit.lexval为在常数表中的入口,当digit为标识符时,digit.lexval为在符号表中的入口

语义规则用来计算与产生式中出现的文法符号相关联的属性的值。在一个语法制导定义中,语法规则中的任一条产生式 A → α A\to\alpha Aα,都有与之相关联的一套语义规则。比如:

E → \to E 1 E_1 E1+T , E.val := E 1 E_1 E1.val + T.val

E → \to T , E.val := T.val

T → \to F , T.val := F.val

F → \to digit , F.val := digit.lexval

为每一个产生式配上语义规则并且在适当的时候执行。即,当归约或推导到某个产生式时,除了按照产生式进行相应的代换之外(语法分析),还要按照所对应的语义规则执行操作,如计算表达式、查填符号表、产生中间代码。

语法树结点N上的非终结符号A的属性可分为两种:

综合属性:只能通过N的子节点或N本身的属性值(一个节点可有多个属性)来定义。语法规则中等号的左边必然为产生式头部。

继承属性:只能通过N的父节点、N本身和N的兄弟结点上的属性值来定义。

在语法分析树中为每个文法符号上加上它们的属性,则称为带注释的语法分析树,简称注释语法分析树。

SDD的求值顺序

对于同时具有继承属性和综合属性的SDD,不能保证有一个顺序来对所有节点上的属性进行求值。例如产生式 A → B A \to B

相关文章:

【从零开始学习计算机科学】编译原理(五)语法制导翻译

【从零开始学习计算机科学】编译原理(五)语法制导翻译 语法制导翻译语法制导定义SDDSDD的求值顺序两类重要的SDD语法制导的翻译方案SDTSDT的实现L属性定义的SDT左递归翻译方案语法制导翻译 语法表述的是语言的形式,或者说是语言的样子和结构。而程序设计语言中另一方面,是…...

uniapp uview 1.0 跨域h5配置多个代理、如何请求接口

参考文章:uniapp uView1.0跨域h5配置多个代理 官方手册:http 请求 项目中使用: 参考其他博主的文章是在manifest.json中配置代理,但在官方的手册中是直接在script请求的,我尝试请求了下没问题,上线后也不…...

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中,安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险,因此,对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…...

Android Glide 缓存模块源码深度解析

一、引言 在 Android 开发领域,图片加载是一个极为常见且关键的功能。Glide 作为一款被广泛使用的图片加载库,其缓存模块是提升图片加载效率和性能的核心组件。合理的缓存机制能够显著减少网络请求,降低流量消耗,同时加快图片显示…...

Mac安装Neo4j图数据库

通过Homebrew 安装(推荐) 打开mac终端: 1. 安装 Homebrew(如果尚未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"2. 安装 Neo4j brew insta…...

《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文

目录 一、什么数据可以表示成一张图 (1)什么是图? (2)如何表示图的属性 (3)images as graphs(将图片表示为图) (4)text as graphs&#xff08…...

[023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级

SpringCloud学习大纲 一、需求说明: 需求1:通过fallback属性进行统一配置 a.问题分析: 1.需要实现cloudalibaba-consumer-nacos-order83模块通过OpenFeign调用cloudalibaba-provider-payment9001 83服务通过OpenFeign调用 9001微服务&…...

设计模式-结构型模式-装饰器模式

概述 装饰器模式 : Decorator Pattern : 是一种结构型设计模式. 作用 : 允许你动态地给对象添加功能或职责,而无需修改其原始类的代码,非常的符合 开闭原则。 实现思路 :通过创建一个包装对象(即装饰器),来…...

RK3588 编译 openssl

在编译 OpenSSL 时,你需要确保你的系统环境已经配置好了所有必要的依赖和编译工具。下面是一般步骤和一些常见问题的解决方案,特别是在使用 RK3588 这类的 ARM 处理器上。 1. 安装依赖 首先,你需要安装编译 OpenSSL 所需的依赖。这通常包括编译器(如 GCC)、make 工具、Per…...

Git前言(版本控制)

1.Git 目前世界上最先进的分布式版本控制系统。 git官网:https://git-scm.com/ 2.版本控制 2.1什么是版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容修改历史,方便查看更改历史记录备份以便恢复以前…...

visual studio配置opencv

文章目录 step1 下载opencvstep2 配置包含目录step 3 配置链接器step4 配置环境变量并重启vs2022step5 检查代码 step1 下载opencv 下载 opencv-4.8.0-windows.exe https://cloud.189.cn/web/share?codefUnqEb7naUra step2 配置包含目录 step 3 配置链接器 step4 配置环境变…...

docker修改daemon.json文件后无法启动

1.问题描述 使用阿里云docker镜像安装的docker,安装成功后默认可以启动。但是修改daemon.json配置后docker服务无法启动,提示如下错误: 从上图发现,docker服务默认使用阿里docker镜像仓库 2.解决方法 根据提示找到docker服务目…...

Linux网络:网络与操作系统1

本文是介绍网络的基本结构,以及和OS之间有什么关系 OSI七层模型 引入 使用网络是为了解决信息的长距离传送,那就需要解决四个问题: 接收方如何使用数据传输的可靠性主机如何定位数据包在局域网如何转发 人们选择用网络协议(t…...

Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策

一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些,DeepSeek是知识型大脑,Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力,例如撰写论文、润…...

Python个人学习笔记(14):函数(匿名函数、内置函数(下)、三元表达式)

九、匿名函数 lambda表达式 语法规则&#xff1a; 变量 lambda 参数1,参数2,…:返回值 例&#xff1a;用lambda简化下述操作 def func(a,b):return ab ret func(1, 2) print(ret)代码&#xff1a; fn lambda a,b:ab print(fn) print(fn(12,13))结果&#xff1a; <fun…...

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…...

【PyCharm】Python和PyCharm的相互关系和使用联动介绍

李升伟 整理 Python 是一种广泛使用的编程语言&#xff0c;而 PyCharm 是 JetBrains 开发的专门用于 Python 开发的集成开发环境&#xff08;IDE&#xff09;。以下是它们的相互关系和使用联动的介绍&#xff1a; 1. Python 和 PyCharm 的关系 Python&#xff1a;一种解释型、…...

【ES6】基础特性总结

概述 仅个人使用&#xff0c;复习ES6的笔记&#xff0c;比较粗糙&#xff0c;仅适用于浏览器端。 数据类型 ES6&#xff08;ECMAScript 2015&#xff09;引入了一些新的数据类型和对现有数据类型的扩展。以下是ES6中数据类型的一个简要总结表格&#xff1a; 数据类型描述Nu…...

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…...

无障碍阅读(Web Accessibility)NVDA打开朗读查看器后,enter键不生效的原因

用NVDA测试Web Accessibility时&#xff0c;打开朗读查看器&#xff0c;enter键会无效&#xff0c;而不打开测试器&#xff0c;就没有问题&#xff0c;很大原因是被应用的元素不是可聚焦的&#xff0c;解决方法尝试&#xff1a; 将标签改为可聚焦的语义化标签&#xff0c;如 b…...

基于docker+python+paddleocr构建自己本地化ocr服务

1、使用FastAPI创建服务实例 1.1、正常程序 from fastapi import FastAPI, UploadFile, File, HTTPException from typing import List from paddleocr import PaddleOCR import numpy as np from PIL import Image import io import loggingapp FastAPI(title"游戏截图…...

【视频】V4L2、ffmpeg、OpenCV中对YUV的定义

1、常见的YUV格式 1.1 YUV420 每像素16位 IMC1:YYYYYYYY VV-- UU– IMC3:YYYYYYYY UU-- VV– 每像素12位 I420: YYYYYYYY UU VV =>YUV420P YV12: YYYYYYYY VV UU =>YUV420P NV12: YYYYYYYY UV UV =>YUV420SP(最受欢迎格式) NV21: YYYYYYYY VU VU =>YUV420SP…...

歌词相关实现

歌词相关 歌词数据模型&#xff1a; // Lyric.swift class Lyric: BaseModel {/// 是否是精确到字的歌词var isAccurate:Bool false/// 所有的歌词var datum:Array<LyricLine>! }// LyricLine.swift class LyricLine: BaseModel {/// 整行歌词var data:String!/// 开始…...

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…...

使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言 在智能交通、地图定位等应用场景中&#xff0c;经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理&#xff0c;通过固定区域裁剪&#xff0c;来有效地识别出图像上显示的经纬度信息。 1. OCR 与 …...

【18】单片机编程核心技巧:变量赋值与高位填充机制

【18】单片机编程核心技巧&#xff1a;变量赋值与高位填充机制 七律 变量赋值探秘 单字赋多字疑云开&#xff0c;高位零填自天来。 清零保守虽稳妥&#xff0c;强制转换更悠哉。 实验验证真章显&#xff0c;编译器间无异态。 嵌入式海行舟稳&#xff0c;类型分明避坑台。 注释…...

网络安全系统集成

随着信息技术的迅猛发展&#xff0c;网络安全问题变得越来越突出。为了应对这一挑战&#xff0c;软考网络安全系统集成应运而生&#xff0c;成为众多企业和机构的重要需求。软考网络安全系统集成旨在培养具备网络安全系统设计、实施和维护能力的专业人才&#xff0c;以满足国家…...

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…...

Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上

1、新建Vue项目 2、在GitHub新建仓库 3、留意建立好仓库后提示的命令 4、进入vue项目目录&#xff0c;在空白处点击鼠标右键选择git bash here 5、输入命令 git init git add . git commit -m "注释内容" 输入之前创建GitHub仓库后记下的代码的第一句 git remote…...

数字孪生技术在工业制造中的应用探索

一、数字孪生&#xff1a;工业4.0的虚实纽带 1.1 技术定义与发展脉络 数字孪生&#xff08;Digital Twin&#xff09;通过实时数据映射&#xff0c;在虚拟空间构建物理实体的动态镜像。其演进历程&#xff1a; 概念萌芽&#xff08;2002年&#xff09;&#xff1a;NASA首次提…...