• tiger-complier 问题记录 类型检查


    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 是同一个

  • 相关阅读:
    美国godaddy服务器,生成html网页出错,Microsoft VBScript runtime error '800a0005'
    Socket 错误一览表
    用php\asp创建 网页桌面快捷方式
    xp sp3 + ie8 支付宝证书 导入出错以及安全验证身份出错 解决办法
    Windows Server 2008正式版激活方法(2009年6月26日更新)
    子网掩码表示 255.255.255.0/24
    局域网中2台无线路由器联接配置方法
    firebug不能断点调试压缩后的js文件问题
    php正则匹配 <div></div>
    apache2 子目录forbidden问题
  • 原文地址:https://www.cnblogs.com/sfzyk/p/9689767.html
Copyright © 2020-2023  润新知