2017-09-28 56 views
-1

我正在爲我創建的靜態類型語言編寫解釋器。解釋器是用C語言編寫的。爲了簡單起見,我只列出兩種基本數據類型,int和float。用於存儲變量,函數,數組和類型的數據結構

我需要某種類型的結構,其可以存儲:

  • 一個基本數據類型
  • 函數返回一個類型
  • 一個某種類型的數組
  • 類型定義

類型可以簡單地作爲基本數據類型或數組或函數之一。因此,有一個函數返回返回一個返回int的函數的函數是有效的。

我知道我可以使用聯合存儲基本數據類型,但是如何存儲函數,數組和類型聲明我不知道。

+1

有關於此主題的整本書。我可能會通過查看其他解釋語言的源代碼來獲得一些想法,例如Python, – OldProgrammer

+0

您能解釋一下「靜態類型」對您意味着什麼嗎?你有[type inference](https://en.wikipedia.org/wiki/Type_inference)嗎?怎麼樣? (這應該進入你的問題)。多解釋一下你的編程語言是什麼樣的。 –

回答

1

閱讀SICP然後Lisp In Small Pieces。他們很好地涵蓋了你的問題。

您可能還需要閱讀Programming Language PragmaticsDragon Book

的一個基本概念是,closure。你需要有他們(如果你想要一流的功能價值和更高層次的功能)。

請注意,類型聲明主要是源代碼的東西。你想要abstract syntax trees(AST),或許就像s-expressions一樣簡單。你可以有symbol table,或者可以有一流的symbols(從interned strings開始)。

你不希望普通的union -s像C,但是tagged unions或者求和類型。你當然想要一個garbage collector。您可以使用Boehm's GC

尋找簡單的Scheme類似的解釋器,例如, here。研究SIOD。研究現有的free software口譯員的源代碼,例如, LuaGuile,等等...

在目標c
0

所有對象(未如int原語)基本上是一個結構,其中所述第一對象是一個指針,指向被稱爲ISA元對象所以像(這是在沒有元簡化對象只是一個類型指標int):

typedef struct{ 
    int isa; 
    int intVal; 
    float floatVal; 
} ObjectType; 

#define INT_TYPE 1 
#define FLOAT_TYPE 2 

ObjectType * newObject(int type, int intVal, float floatVal) 
{ 
    ObjectType * r = calloc(sizeof(ObjectType *),1); 
    r->isa=type; 
    if (type == INT_TYPE) 
    { 
     r->intVal=intVal; 
    }else if (type == FLOAT_TYPE) 
    { 
     r->floatVal=floatVal 
    }else{ 
      free(r); 
      return NULL; 
    } 
    return r; 
} 

然後爲float和int創建一個getter ...這將是一個非常簡單的開始。

+0

這是如何回答這個問題的? –

+0

@BasileStarynkevitch是一個可以容納int或浮點數的對象類型 –

+0

這隻能存放int和float,而不是數組,函數等 –