編輯:關於android開發
關於“靜態類型檢查”,想必使用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); }
Android二手交易平台,dagger2+mvp+Bmob後台雲搭建,dagger2bmob二手交易平台 我的畢業設計項目安卓源碼,二手交易平台,dagger2+mvp
Android中ListView實現圖文並列並且自定義分割線(完善仿微信APP),androidlistview昨天的(今天凌晨)的博文《Android中Fragment
我的Android進階之旅------)關於android:layout_weight屬性的詳細解析 關於android:layout_weight屬性的詳細解析 效
關於我,關於我們個人微信公眾號:zhaoyanjun125 , 歡迎關注 QQ交流群:431048982