• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 编译器开发系列--Ocelot语言6.静态类型检查,编译器--ocelot

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

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了ocelot巧克力,ocelot,ocelot是什么意思,michel ocelot,ocelot life等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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


关于“静态类型检查”,想必使用C 或Java 的各位应该非常熟悉了。在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错。例如结构体之间无法用+ 进行加法运算,指针和数值之间无法用* 进行乘法运算,将数组传递给参数类型为int 型的函数会出现莫名其妙的结果。在编译过程中检查是否符合这样的限制的处理就是静态类型检查。

在静态类型检查过程中也会实施隐式类型转换。

    /*入口
     * 
     */
    public void check(AST ast) throws SemanticException {
    	/*
    	 * 第1 个foreach 语句对全局变量的定义进行遍历,
    	 */
        for (DefinedVariable var : ast.definedVariables()) {
            checkVariable(var);
        }
        /*
         * 第2 个foreach 语句对函数定义进行遍历,并实施类型检查。
         */
        for (DefinedFunction f : ast.definedFunctions()) {
            currentFunction = f;
            checkReturnType(f);
            checkParamTypes(f);
            check(f.body());
        }
        if (errorHandler.errorOccured()) {
            throw new SemanticException("compile failed.");
        }
    }
    /*
     * checkVariable 方法在检查变量的类型是否为非void 的同
		时,还对变量的初始化表达式进行遍历。
     */
    private void checkVariable(DefinedVariable var) {
        if (isInvalidVariableType(var.type())) {
            error(var.location(), "invalid variable type");
            return;
        }
        if (var.hasInitializer()) {
            if (isInvalidLHSType(var.type())) {
                error(var.location(), "invalid LHS type: " + var.type());
                return;
            }
            check(var.initializer());
            var.setInitializer(implicitCast(var.type(), var.initializer()));
        }
    }
    /*
     * checkReturnType 方法检查函数返回值的类型是否为非结
		构体、联合体或数组。这里再重复一下,Ocelot中函数不能返回结构体或联合体。
     */
    private void checkReturnType(DefinedFunction f) {
        if (isInvalidReturnType(f.returnType())) {
            error(f.location(), "returns invalid type: " + f.returnType());
        }
    }
    /*
     * checkParamTypes 方法检查函数形参的类型是否为非结构体、联合体或void。因为Ocelot
		中函数参数的类型不能是结构体或联合体。
     */
    private void checkParamTypes(DefinedFunction f) {
        for (Parameter param : f.parameters()) {
            if (isInvalidParameterType(param.type())) {
                error(param.location(),
                        "invalid parameter type: " + param.type());
            }
        }
    }
    /*
     * check 是遍历参数节点的方法。各节点类会重写该函数,通过调用check(f.
		body()) 对函数体进行遍历。
     */
    private void check(StmtNode node) {
        visitStmt(node);
    }

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 编译器开发系列--Ocelot语言6.静态类型检查,编译器--ocelot
  • 编译器开发系列--Ocelot语言2.变量引用的消解,编译器--ocelot
  • 编译器开发系列--Ocelot语言3.类型名称的消解,编译器--ocelot

相关文章

  • 2017-05-26Android与HTML+JS交互入门
  • 2017-05-26[原创]Eclipse 安卓开发几个异常的处理办法,eclipse安卓
  • 2017-05-222.5.4 AutoCompleteTextView(自动完成文本框)的基本使用
  • 2017-05-26Android之TextView,androidtextview
  • 2017-05-26Android开发笔记(9)——初步设置Menu,androidmenu
  • 2017-05-26硅谷新闻7--顶部轮播图循环播放,7--循环播放
  • 2017-05-26Android进阶--Acticivity的启动模式,acticvity启动模式
  • 2017-05-26Android EditText 取消复制粘贴功能,取消横向全屏编辑功能(一),androidedittext
  • 2017-05-26自定义控件——开关按钮ToggleButton,控件togglebutton
  • 2017-05-26Android一个ListView列表之中插入两种不同的数据,androidlistview

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • [Android学习]ListView显示多种item的处理办法
    • Android--播放Gif的取巧办法,android--gif取巧
    • android开发中常见布局的注意点,android开发布局
    • android shareSDK实现第三方分享,androidsharesdk
    • Android入门(二)Activity-Toast、Intent,intentservicetoast
    • Loader加载器,loader加载
    • Android中View实现弹性滑动的方法——Android开发艺术探索笔记
    • Android-将RGB彩色图转换为灰度图,
    • Android 操作数据库的框架——greenDAO的学习
    • Android 隐藏状态栏 标题栏

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有