直譯器構造實現函式呼叫

鴨脖發表於2012-11-03
函式呼叫是直譯器中必須實現的功能。函式呼叫同樣遵循先定義,然後才能呼叫的原則。在本文中,使用一個函式表儲存所有的函式資訊。函式表的結構與符號表很類似。具體結構如下: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;    當對函式建立語法樹時,將函式的相應資訊寫入符號表中,並對各個函式進行編號。考慮效率問題,同樣使用了雜湊函式。當函式呼叫發生時,首先通過函式名得到相應的在函式表中的函式編號。之後進行實參和形參的匹配。匹配成功後,則從對應的函式表中直接定位到實際的函式語法樹的頭指標,並執行函式體的語法樹。進而返回函式值。以上就是函式呼叫實現的過程。類似的,也可以在一個函式的實現中呼叫另一個函式。   

相關文章