Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 編譯器開發系列--Ocelot語言6.靜態類型檢查,編譯器--ocelot

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

編輯:關於android開發

編譯器開發系列--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);
    }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved