1##

注意区分 Ty_xxx 和 a_ 的区别

A 开头是对应的是原程序中的一个实体

Ty _ 开头则是类型检查中的一个抽象类 代表了一类实体

比如

A_recordTy 是原程序中的 type per {name:string , age:int}

Ty_record 则是一种类型的抽象 是 Ty_ty { TyfieldList } tyfield ->{name : ty_string }

2##

C 语言中初值是不会自动分配的,如下代码

Ty_tyList makeFormalTyList(S_table tenv, A_fieldList param){
Ty_tyList p=NULL; // 这里初始值没有分配导致不能够正常工作
while(param) {
Ty_ty arg_ty = S_look(tenv, param->head->typ);
if (!arg_ty) {
EM_error(param->head->pos, "not such type");
break;
}
p = Ty_TyList(arg_ty, p);
param = param -> tail;
}
return p;
}

3##

没有IDE 的情况下把 tenv 和 venv 搞反 看来没有IDE 真实要时刻注意以前的约定

4##

注意绝对不要出现

while(p->tail)

至少是 while(p && p->tail)

while(p && p->kind==Ty_name) {

p=p->u.name.ty;

}

教训

field 类型##

5 actul_ty 的作用

由于存在可以递归的函数和类型

而且在进行 var dec 的时候我们要确保绑定的是 其的最终类型 使用函数 actual_ty 就是顺着namety 的定义一路向上找到第一个非namety的类型

就是说 再定义的时候可以使用 namety进行变量的定义 但是在绑定的时候我们使用actul ty 绑定跟随的根本的定义

在 Typedec 的时候 我们也会遇到 namety 定义 但是这里我们要注意 namety 类型定义可以有 但是不允许循环

循环只能通过 record 或者 array 定义 ,这里同样的 使用 actul_ty 进行查找一个类型的根本定义

因为有的类型 比如 type a = b 这样定义的的类型就是一个 namety type

6 递归进行##

函数的递归定义和 类型定义 的递归定义 大同小异

对于类型来说我们先进行 将类型的头送入 环境中 统一类型 Namty ty 设置为 NULL (就是只有名字的一个类型)

第二边扫描进行的时候 我们根据每一个类型的头 取出刚才存下的半截定义

对定义剩下的半截 进行 transty transty 的时候(如果有递归 就会取到其他的递归类型(也许是半截定义))

然后补全这个定义的Ty类型

然后对补全了的定义进行 第二次送入环境

这样做的结果就是 环境中实际上有两个函数词条 对于非namety 词条来说两个此条中的 ty 是同一个

tiger-complier 问题记录 类型检查的更多相关文章

  1. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

    一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...

  2. 关于C++类型检查的一点小挫折

     问题: 定义了一个float型数组Lut[],我让一个整型指针指向数组名int * Address=lut ; VS2008报错:  error C2440: '=' : cannot conv ...

  3. Android VLC播放器二次开发2——CPU类型检查+界面初始化

    上一篇讲了VLC整个程序的模块划分和界面主要使用的技术,今天分析一下VLC程序初始化过程,主要是初始化界面.加载解码库的操作.今天主要分析一下org.videolan.vlc.gui.MainActi ...

  4. vue项目配置使用flow类型检查

    你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪 ...

  5. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  6. Java中静态类型检查是如何进行的

    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间 ...

  7. Flow: JavaScript静态类型检查工具

    Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...

  8. oracle中的记录类型

    单词RECORD有“记录”的意思,因此RECORD也称为“记录类型”,使用该类型的变量可以存储由多个列值组成的一行数据. 在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量. ...

  9. Swift类型检查与转换

    继承会发生在子类和父类中,如图所示,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类.这个继承关系类图的具体实现 ...

随机推荐

  1. AM8后台历史数据手工清理方法

    AM8后台历史数据手工清理方法 数据清理目前通过bat脚本将windows任务计划来完成 Bat 路径位置: \ActiveSoft\Am8Svr\STKServer\Data    (请根据服务安装 ...

  2. Python自学:第五章 对数字列表执行简单的统计计算

    >>>digits = [1,2,3,4,5,6,7,8,9,0] >>>mid(digits) 0 >>>max(digits) 9 >& ...

  3. thinkphp 模板布局

    ThinkPHP的模板引擎内置了布局模板功能支持,可以方便的实现模板布局以及布局嵌套功能. 有三种布局模板的支持方式: 第一种方式:全局配置方式 这种方式仅需在项目配置文件中添加相关的布局模板配置,就 ...

  4. 「题解」:$e$

    问题 B: $e$ 时间限制: 2 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 话说一天考两个主席树这回事…… 正解可以叫树上主席树??(脸哥说也叫主席树上树???) 对于树上的每 ...

  5. 锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘(强制关机后引起的问题)

    电脑强制关机后,centos系统启动失败,报异常:锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘.解决办法:进入D:\vms\S1目录,删除下 ...

  6. Entityframwork.extended 配置mysql

    entityframework.extended 这个是个很好的扩展,不过由于默认是配置成MSSQL的,今天在github上面 看到一个解决方案,亲测可用,下面贴代码 1.在DbContext 修改默 ...

  7. day23_1-re模块之转义字符、分组、方法

    #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...

  8. PAT甲级——A1104 Sum of Number Segments【20】

    Consider a positive integer N written in standard notation with k+1 digits a​i​​ as a​k​​⋯a​1​​a​0​​ ...

  9. 如何利用开源思想开发一个SEO友好型网

    如果你有一个网站需要去做SEO优化的时候,不要期望你的努力能立即得到回报.耐心等待并更正内容营销策略,最终会发现你的网站很受用户欢迎.下面就教你如何利用开源思维开发一个SEO友好型网站! 首先,你应该 ...

  10. Linux权限命令chmod

    一.Linux chmod命令修改文件和文件目录权限(默认情况下只有root用户才能使用).命令格式:chmod+修改内容+要修改的文件或者 目录 或者 chmod -R 修改内容 要修改的文件或者 ...