编译原理第二章_编译原理 a:real;b:↑integer-程序员宅基地

技术标签: 编译原理  

编译原理第二章

引言

什么是数据类型

数据类型实质上是对存储器中所存储的数据进行的抽象。它包含了一组值的集合和一组操作。

数据类型的作用

实现了数据的抽象,从机器的具体特征中解脱出来,提高了编程效率

数据类型的分类

  • 内部类型
  • 用户定义类型

内部类型

内部类型的特点

内部类型的优越性

  • 基本类型不可见某些动态特性不一定能查出,如i/j中j=0

  • 编译能检查变量使用的正确性

  • 编译时可确定无二意性

  • 精度控制

    精度说明有利于空间优化
    精度说明可作为检查的一种手段
    精度说明有利于程序的修改

用户自定义类型

笛卡尔积

有限映像

序列

递归

判断或

幂集

C语言的数据类型

非结构类型

分为内部类型和用户自定义类型
非结构内部类型有整型、实型和字符型

聚合构造

数组

实现有限映像
说明的格式
<类型说明符> <数组名> [常量表达式]

可以定义多维数组
说明的格式
<类型说明符> <数组名> [常量表达式]…[常量表达式]

C语言的数组按行存放
对数组名的处理相当于指针

结构

联合

文件

指针

空类型

抽象数据类型

用户定义类型与内部定义类型的抽象

抽象数据类型的定义

类型检查

静态检查:在编译时的检查

动态检查:在运行时的检查

无类型语言:没有类型的语言

弱类型语言:语言的类型检查不能全部在编译时完成,有些在运行时完成

强类型语言:语言的类型检查全部在编译时完成

类型转换

将一个类型的值转换成另一个类型的值,称为类型转换;
类型转换分为拓展(widening)收缩(narrowing)

扩展:转换之后的类型值的集合包含转换之前的类型值的集合;

例如:
整型->实型

收缩:转换之前的类型值的集合包含转换之后的类型值的集合;例如:
实型->整型

在某些语言中,类型转换的要求和规则是隐式的,它由编译器自动生成类型转换的代码;
一般来说,语言对基本类型提供适当的类型转换,而对复合类型或用户自定义类型不提供转换;

隐式转换发生在下述的情况下:
混合运算:级别低的类型向级别高的类型值转换。
**将表达式的值赋给变量:**表达式的值向变量类型的值转换。
**实参向函数形参传值:**实参的值向形参的值进行转换。
**函数返回值:**返回值向函数返回类型的值进行转换。

类型等价

若T1和T2是两个类型,T1的任何值都可以赋予T2类型的变量,反之亦然,T1类型的实参可以对应类型T2的形参,反之亦然,则称T1和T2是相容的,或等价的;

两种相容性实现时的比较
①名字等价的实现比较简单
②结构等价的实现需要的模式匹配过程可能十分复杂

实现模型

在实现模型中,数据用描述符和数据对象来表示;描述符用来描述数据对象的所有属性

内部类型和用户定义的非结构类型的实现模型

描述符一般由“类型”和一个指针组成

子界的描述符必须包括子界的界值
布尔型和字符型可以压缩存储

结构类型的实现模型

笛卡尔积

各成分顺序排列(数据)
描述符包含:类型名、构造符、若干三元式。每个域对应一个三元式(选择符名,域类型,指针)
每个成分占整数个可编址的存储单元(字编址或字节编址)

type t=record a:real;
              b:integer;
       end;

有限映像

为每一成分分配整数个可编址的存储单元
描述符包括:类型名、构造符、定义域的基类型、下界、上界、成分类型、单元个数、首地址
内情向量 ;

地址公式的计算
若定义域类型是子界m…n,每个元素占k个存储单元,那么,按照 k × \times ×(i-m)计算a[i]从首地址b到所分配的存储之间的位移。
a[i]的地址可以写成
b+k × \times ×(i-m)= b-k × \times ×m+k × \times ×i = b’+ k × \times ×i
其中, b’= b-k$ \times$m 是编译时能计算出的

type a=array[1..10] of real;

序列

PASCAL中的串长度静态可定;静态分配;
其他语言中(如SNOBOL 4和ALGOL 68中),可变长串的表示:
静态描述符+动态描述符+堆

判定或

对判定或类型的变量所分配的空间应足以容纳需要最大空间的变体的值
Pascal的变体记录的表示包括:描述符、数据对象、case表、若干变体描述符

type v=record a:integer;
              case b:boolean of
              true:(c:integer);
              false:(d:integer;
                     e:real)
        end;

幂集

对幂集可以通过访问的存储空间(例如机器字)来有效地实现。
若在某个集合S中出现基类型的第i个元素,那么与 S 相关联的字的第i个位置为“1”。

两个集合 位操作
联合通过它们相关联的字的“或”操作来实现
交集通过“与”操作来实现。

指针

指针变量的表示类似于内部类型,只是其值为一地址
它指向的匿名数据对象分配在堆上

层次数据结构对象的表示

描述符中的类型可以指向另外的描述符

type t1=array[0..3] of integer;
     t=record a:real;
              b:t1;
              c:integer;
        end;

type t4=array[0..5] of integer;
     t2=array[0..2] of  t4;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43309286/article/details/104430895

智能推荐

Spring Cloud(六)配置中心(Spring Cloud Config)_本地运行config-prod.properties-程序员宅基地

文章浏览阅读241次。一、简介在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config 。Spring Cloud Config就是我们通常意义上的配置中心。Spring Cloud Config-把应用原本放在本地文件的配置抽取出来放在中心服务器,本质是配置信息从本地迁移到云端。..._本地运行config-prod.properties

Linux常见基本指令合集及其效果展示_linux 展示-程序员宅基地

文章浏览阅读268次,点赞2次,收藏6次。首先先问大家一个问题:在磁盘上建一个空文件,这个文件会占据磁盘的储存空间吗?实践出真知,我们发现新建一个文本文档,它的大小是0kB,这时有小伙伴就会认为既然它的大小是0KB,那么它当然也就不会占用磁盘空间咯。然而真的是这样吗?我们打开这个文件的属性来一探究竟:我们发现系统不仅记录了这个空文件的大小,同时还有它的文件名、文件类型、所在位置、创建时间等信息,难道这些信息不要占用系统空间吗,当然要!一个空文件同样会占用系统空间文件 = 文件内容 + 属性路径的本质就是这颗多叉树的搜索路径。_linux 展示

iTOP-3588开发板快速启动手册Windows安装串口终端调试串口常见问题(二)_windows 调试串口-程序员宅基地

文章浏览阅读140次,点赞10次,收藏3次。问题二:非旺玖原装PL2303,请联系供货商或PL2303TA不支持WINDOWS11及后续版本问题。进设备管理器,找到端口COM,有问题会提示“非旺玖原装的PL2303,请联系您的供货商”。更多内容可以B站搜索迅为RK3588开发板;2.4.2 驱动问题。_windows 调试串口

python怎么输出_Python如何输出整数-程序员宅基地

文章浏览阅读7.7k次。Python输出整数的方法:先使用str()函数将数字转换成字符串赋值给变量i,再用“if i.count('.') == 0”语句判断字符串中是否没有小数点,如果是则输出这个字符串,这样输出的数字就都是整数了示例代码如下:x = [23.5, 45.6, 987, 698, 123, 654]for i in x:i = str(i)if i.count('.') == 0:print(I)执行..._python的print整数

js中好用的方法(复制剪贴板、时间转换、大数字单位转换)_js 粘贴板时间-程序员宅基地

文章浏览阅读146次。js中好用的工具方法复制内容到手机剪贴板:/** * 拷贝数据到剪贴板 */ public static CopyToClipBoard(str){ let copyDom = document.createElement("input"); // 获得需要复制的内容 copyDom.setAttribute("value",str); //不需要让他displaynone // copyDom._js 粘贴板时间

FTP上传下载工具类_vsftp下载工具类-程序员宅基地

文章浏览阅读419次。记录一篇将图片等静态资源上传至vsftpd服务器的工具类package com.zhouym.baiwei.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.i..._vsftp下载工具类

随便推点

EDM邮件群发的关键要素?如何高效地发信?-程序员宅基地

文章浏览阅读267次,点赞6次,收藏4次。EDM邮件群发虽然看似简单,但其中蕴含的要素却十分丰富。AokSend,依托强大API/SMTP接口,实现EDM邮件高效群发。精准触达,一键发送,让您的营销信息迅速覆盖目标客户,提升品牌影响力!

对话框未进入PreTranslateMessage函数-程序员宅基地

文章浏览阅读235次。定义了两个对话框CDlgParent和CDlgChild,CDlgChild已设置Child属性,CDlgParent未重定义PreTranslateMessage函数,在CDlgChild的PreTranslateMessage函数中设断点,未运用原因: 对话框均在动态库中定义,且为使用共享MFC DLL的规则DLL,此方式无法响应PreTranslateMessage消息,但应用程序可不使..._mfc pretranslatemessage 不进入

UI自动化测试之5大常见问题(建议收藏)(1),2024年最新从青铜到王者的路线-程序员宅基地

文章浏览阅读722次,点赞10次,收藏19次。1)UFT即原来的QTP与ST合并而来,由HP公司开发,是一个企业级的商业自动化测试工具,提供了强大易用的录制回放功能,同时兼容对象识别模式与图像识别模式,支持B/S和C/S两种架构的软件测试;一款基于python语言编写的自动化测试框架工具,具备良好的扩展性,支持关键字驱动,支持多种类型的客户端和接口,可进行分布式测试;3)Selenium自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

Linux创建操作网桥的两种命令及持久化_bridge命令-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏48次。1.基础介绍1.1 简述1.2 网桥配置命令及安装(CentOS系统)2. brctl和bridge命令建桥2.1 brctl命令说明及范式2.2 brctl场景使用2.3 bridge命令及范式3.ip命令建桥3.1 ip命令建桥说明4.桥的持久化1.基础介绍1.1 简述什么是网桥  网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。它是Linux上用来做TCP/IP二层协议交._bridge命令

css3大全-程序员宅基地

文章浏览阅读153次。孔子曰:学而不思则罔,思而不学则殆。废话不多说,直接上。浅谈兼容css相较于js html来说,兼容性问题最不是事,CSS在最初设计时,就有一个协议:如果不能识别选择器属性,那么就默认不处理,不报错。这个也是CSS得以发展的非常重要的特征。下面是各个浏览器私有前缀:IE -ms-Chrome -webkit-Firefox -moz-Safari -webkit-..._css 文字后仰

Linux学习笔记 01 - Linux概况_linux 从哪个版本开始支持lvm-程序员宅基地

文章浏览阅读760次。一、操作系统的发展历程操作系统是用来=控制和管理系统资源、方便用户使用计算机的程序的集合,是人机交互的接口。大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。1. 服务器专用的 UNIX 操作系统UNIX 操作系统与1969年由美国贝尔实验室肯·汤普森(K.Thompson)和丹尼斯·麦卡利斯泰尔·里奇(D.M.Ritchie)开发完成,是真正意义上的多用户多任务操作系统。UNIX的商业版版本主要包括SUN公司(现被Oracle公司收购)的Solaris、IBM_linux 从哪个版本开始支持lvm