2017-09-28 20 views
-1

私が作成した静的型付き言語用のインタープリタを作成しています。インタプリタはC言語で作成されています。わかりやすくするために、intとfloatの2つの基本データ型のみを示します。変数、関数、配列、型を格納するためのデータ構造

私は保存することができますいくつかの種類の構造体を必要とする:

  • 基本データ型
  • タイプ
  • 1つのいくつかのタイプ
  • 型定義
  • の配列を返す関数を

の型は、単純に基本データ型の1つでも、配列や関数でもかまいません。したがって、intを返す関数を返す関数を返す関数を持つことは有効です。

私は、ユニオンを使用して基本データ型を格納することができますが、関数、配列、型宣言を格納する方法はわかりません。

+1

このトピックについて書かれた全書籍があります。私は多分Pythonのような他のインタープリター言語のソースを見ていくつかのアイデアを得るでしょう。 – OldProgrammer

+0

"静的型付け"があなたに何を意味するのか説明できますか? [型推論](https://en.wikipedia.org/wiki/Type_inference)がありますか?どうやって? (それはあなたの質問に入るはずです)。あなたのプログラミング言語がどんなものかを少し説明してください。 –

答えて

1

SICP,Lisp In Small Piecesをお読みください。彼らはあなたの質問をきちんとカバーしています。

また、基本的な概念はclosureのものであるProgramming Language PragmaticsDragon Book

を読むことをお勧めします。あなたはそれらを持っている必要があります(ファーストクラスの関数値とより高いレベルの関数が必要な場合)。

型宣言は、ほとんどがソースコードのことです。 abstract syntax trees(AST)が必要な場合は、おそらくs-expressionsと簡単です。 symbol table、またはファーストクラスsymbolsinterned stringsで始まる)を持つことができます。

union -sはCと似ていますが、tagged unionsまたは合計タイプは不要です。あなたは確かにgarbage collectorが欲しいです。 Boehm's GCを使用できます。

単純なSchemeのようなインタプリタを探します。 here。研究SIOD

既存のfree softwareインタプリタのソースコードを調べてください。 LuaGuile、などなど...すべてのオブジェクト(int型のようではないプリミティブ)は基本的に第1の目的は(これはメタずに簡略化されているようなので、何かISAと呼ばれるメタオブジェクトへのポインタである構造体ですObjective-Cの中

0

オブジェクトは単に型インジケータ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のゲッターを作成します。これは非常に簡単なスタートになります。

+0

これはどうやって質問に答えますか? –

+0

@BasileStarynkevitchはint型またはfloat型を保持できるオブジェクト型です –

+0

これは配列や関数などではなくint型とfloat型しか保持できません –

関連する問題