直譯器構造實現函式呼叫
函式呼叫是直譯器中必須實現的功能。函式呼叫同樣遵循先定義,然後才能呼叫的原則。在本文中,使用一個函式表儲存所有的函式資訊。函式表的結構與符號表很類似。具體結構如下: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; 當對函式建立語法樹時,將函式的相應資訊寫入符號表中,並對各個函式進行編號。考慮效率問題,同樣使用了雜湊函式。當函式呼叫發生時,首先通過函式名得到相應的在函式表中的函式編號。之後進行實參和形參的匹配。匹配成功後,則從對應的函式表中直接定位到實際的函式語法樹的頭指標,並執行函式體的語法樹。進而返回函式值。以上就是函式呼叫實現的過程。類似的,也可以在一個函式的實現中呼叫另一個函式。
相關文章
- 直譯器構造文法簡述
- 構造和解構函式呼叫順序函式
- Python直譯器簡介(1):函式物件Python函式物件
- 實現JavaScript語言直譯器(三)JavaScript
- 深入 WebAssembly 之直譯器實現篇Web
- Servlet呼叫構造方法,物件傳不進建構函式中去問題Servlet構造方法物件函式
- 構造java函式(轉)Java函式
- 呼叫函式實現兩個數交換函式
- 構造解構函式的妙用-成對出現 (轉)函式
- 用 Python 實現 Python 直譯器Python
- Golang實現微型數學運算直譯器Golang
- 實現指令碼直譯器 - 詞法分析器指令碼詞法分析
- [C++]顯示呼叫建構函式和解構函式C++函式
- 從編譯原理看一個直譯器的實現編譯原理
- [譯] 解析 Go 中的函式呼叫Go函式
- C++ 建構函式實戰指南:預設構造、帶引數構造、複製構造與移動構造C++函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- .Net7 CLR的呼叫函式和編譯函式函式編譯
- Linux QoS實現框架:函式呼叫流程圖Linux框架函式流程圖
- js實現的iframe呼叫父頁面函式JS函式
- [譯] 建構函式已死,建構函式萬歲!函式
- Skywalking-07:OAL原理——直譯器實現
- 自定義語言的實現——直譯器模式(五)模式
- 自定義語言的實現——直譯器模式(四)模式
- 自定義語言的實現——直譯器模式(三)模式
- 自定義語言的實現——直譯器模式(二)模式
- 建構函式之間的呼叫函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 【譯】JavaScript 工廠函式 vs 建構函式JavaScript函式
- [譯] 理解JS的函式呼叫和‘this’的指向JS函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- CMM編譯器和C編譯器過程呼叫實現的比較編譯
- Golang實現JAVA虛擬機器-指令集和直譯器GolangJava虛擬機
- 然並卵:BF 科普 & BF 直譯器的 JS 實現JS
- 用java寫lisp 直譯器 (10 實現物件和類)JavaLisp物件
- Java的預設建構函式呼叫Java函式
- (函式)實現strstr函式函式
- Node.js REPL(互動式直譯器)Node.js