用于存储变量,函数,数组和类型的数据结构

时间:2017-09-28 15:50:23

标签: c arrays data-structures struct interpreter

我正在为我创建的静态类型语言编写解释器。解释器是用C语言编写的。为简单起见,我将仅列出两种基本数据类型:int和float。

我需要一种可存储的结构:

  • 基本数据类型
  • 返回类型的函数
  • 一个类型的数组
  • 类型定义

类型可以只是基本数据类型之一,也可以是数组或函数。因此,有一个函数返回一个函数返回一个返回int的函数是有效的。

我知道我可以使用union存储基本数据类型,但是如何存储我不知道的函数,数组和类型声明。

2 个答案:

答案 0 :(得分:1)

阅读SICP然后Lisp In Small Pieces。他们非常清楚你的问题。

您可能还想阅读Programming Language PragmaticsDragon Book

基本概念是closure的概念。你需要拥有它们(如果你想要一流的函数值和更高级的函数)。

请注意,类型声明主要是源代码。你想要abstract syntax trees(AST),也许就像s-expressions一样简单。您可以拥有symbol table,也可以拥有一流的symbols(以interned strings开头)。

你不希望普通union - 像C一样,但是tagged unions或和类型。你当然想要一个garbage collector。您可以使用Boehm's GC

寻找简单的Scheme - 就像翻译一样,例如here。研究SIOD

研究现有free software解释器的源代码,例如: LuaGuile等等......

答案 1 :(得分:0)

在objective-c中所有对象(不是像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 ......这将是一个非常简单的开始。