直譯器構造實現函式呼叫
函式呼叫是直譯器中必須實現的功能。函式呼叫同樣遵循先定義,然後才能呼叫的原則。在本文中,使用一個函式表儲存所有的函式資訊。函式表的結構與符號表很類似。具體結構如下:typedef struct FunctionNode{ FunctionNode* Next; wchar_t*
FunctionNamePtr; //儲存函式名,動態生成 wchar_t* FunctionType;//函式型別,即函式返回值型別,動態生成 ParaNode* ParaPtr;//指向引數節點 int ParaNumber; //引數個數,也即形參個數 int IsForCreateST int IsEmpty;//檢查一個節點是否已經有內容。 int FuncNumber; //函式編號。
CTokenTable TokenTable;//儲存函式的符號表}FunctionNode,*FunctionNodePtr;typedef struct FunctionParameterNode{ FunctionParameterNode* next; wchar_t* ParameterType; //引數型別,動態生成 wchar_t*ParameterNamePtr;//引數名,動態生成}ParaNode,*ParaNodePtr; 當對函式建立語法樹時,將函式的相應資訊寫入符號表中,並對各個函式進行編號。考慮效率問題,同樣使用了雜湊函式。當函式呼叫發生時,首先通過函式名得到相應的在函式表中的函式編號。之後進行實參和形參的匹配。匹配成功後,則從對應的函式表中直接定位到實際的函式語法樹的頭指標,並執行函式體的語法樹。進而返回函式值。以上就是函式呼叫實現的過程。類似的,也可以在一個函式的實現中呼叫另一個函式。
相關文章
- 構造和解構函式呼叫順序函式
- 實現JavaScript語言直譯器(三)JavaScript
- 深入 WebAssembly 之直譯器實現篇Web
- 函式呼叫暫存器及棧幀結構函式
- .Net7 CLR的呼叫函式和編譯函式函式編譯
- Linux QoS實現框架:函式呼叫流程圖Linux框架函式流程圖
- 呼叫函式實現兩個數交換函式
- Skywalking-07:OAL原理——直譯器實現
- 實現指令碼直譯器 - 詞法分析器指令碼詞法分析
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- 建構函式之間的呼叫函式
- 【譯】JavaScript 工廠函式 vs 建構函式JavaScript函式
- [譯] 理解JS的函式呼叫和‘this’的指向JS函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 類的解構函式自動呼叫函式
- 【翻譯】理解JS的函式呼叫和‘this’的指向JS函式
- 迴圈單連結串列建構函式、解構函式C++實現函式C++
- Golang實現JAVA虛擬機器-指令集和直譯器GolangJava虛擬機
- 使用resilience4j-retry實現函式呼叫重試函式
- 然並卵:BF 科普 & BF 直譯器的 JS 實現JS
- 用java寫lisp 直譯器 (10 實現物件和類)JavaLisp物件
- 嵌入式軟體架構設計-函式呼叫架構函式
- Node.js REPL(互動式直譯器)Node.js
- 利用Matlab filterDesigner 工具生成FIR濾波器函式,並呼叫實現低通濾波MatlabFilter函式
- 子函式呼叫函式
- 函式呼叫棧函式
- Ipython 直譯器Python
- 用函式索引構造特殊的約束函式索引
- 建構函式,拷貝賦值函式的N種呼叫情況函式賦值
- 構造器中呼叫動態繫結的方法
- 深入探討Function Calling:實現外部函式呼叫的工作原理Function函式
- ClickHouse原始碼筆記3:函式呼叫的向量化實現原始碼筆記函式
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- 深入解構objc_msgSend函式的實現OBJGse函式
- (譯) 函式式 JS #2: 函式!函式JS
- 你不知道的JavaScript--Item8 函式,方法,建構函式呼叫JavaScript函式
- C++:建構函式的分類和呼叫C++函式
- 自制Monkey語言編譯器:實現函式閉包功能和為語言增加複雜資料結構編譯函式資料結構
- C#使用委託實現函式回撥,方法呼叫攔截C#函式