編譯器開發系列--Ocelot語言6.靜態類型檢查

来源:http://www.cnblogs.com/joey-hua/archive/2016/12/22/6211596.html
-Advertisement-
Play Games

關於“靜態類型檢查”,想必使用C 或Java 的各位應該非常熟悉了。在此過程中將檢查表達式的類型,發現類型不正確的操作時就會報錯。例如結構體之間無法用+ 進行加法運算,指針和數值之間無法用* 進行乘法運算,將數組傳遞給參數類型為int 型的函數會出現莫名其妙的結果。在編譯過程中檢查是否符合這樣的限制 ...


關於“靜態類型檢查”,想必使用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);
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • access_token分兩種 access_token就是一種許可權集合的含義. ...
  • 直接看代碼吧!!! ...
  • 現實中:電臺要發佈消息,通過廣播把消息廣播出去,使用收音機,就可以收聽廣播,得知這條消息。Android中:系統在運行過程中,會產生許多事件,那麼某些事件產生時,比如:電量改變、收發簡訊、撥打電話、屏幕解鎖、開機,系統會發送廣播。 只要應用程式接收到這條廣播,就知道系統發生了相應的事件,從而執行相應 ...
  • 一、網路保存數據介紹 可以使用網路來保存數據,在需要的時候從網路上獲取數據,進而顯示在App中。 用網路保存數據的方法有很多種,對於不同的網路數據採用不同的上傳與獲取方法。 本文利用LeanCloud來進行網路數據的存儲。 LeanCloud是一種簡單高效的數據和文件存儲服務。感興趣的可以查看網址: ...
  • NSURLConnection在iOS9被宣佈棄用,NSURLSession從13年發展到現在,終於迎來了它獨步江湖的時代.NSURLSession是蘋果在iOS7後為HTTP數據傳輸提供的一系列介面,比NSURLConnection強大,坑少,好用.今天從使用的角度介紹下. ...
  • 大家在網上購物時都有這樣一個體驗,在確認訂單選擇收貨人以及地址時,會跳轉頁面到我們存入網站內的所有收貨信息(包含收貨地址,收貨人)的界面供我們選擇,一旦我們點擊其中某一條信息,則會自動跳轉到訂單提交界面,此時的收貨信息已經變為我們之前選擇的收件信息、 為了實現這個功能,Android提供了一個機制, ...
  • 前言斷點續傳概述斷點續傳就是從文件賞賜中斷的地方重新開始下載或者上傳數據,而不是從頭文件開始。當下載大文件的 ...
  • Ocelot的中間代碼是仿照國外編譯器相關圖書Modern Compiler Implementation 中所使用的名為Tree 的中間代碼設計的。顧名思義,Tree 是一種樹形結構,其特征是簡單,而且方便轉換為機器語言。 例如以下代碼: 會被轉換成如下的中間代碼: 組成中間代碼的類如表11.1 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...