【问题标题】:Data structure for storing variables, functions, arrays and types [closed]用于存储变量、函数、数组和类型的数据结构
【发布时间】:2017-09-28 15:50:23
【问题描述】:

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

我需要某种可以存储的结构:

  • 基本数据类型
  • 返回类型的函数
  • 某种类型的数组
  • 类型定义

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

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

【问题讨论】:

  • 关于这个主题的书籍有很多。我可能会通过查看其他解释语言的来源获得一些想法,例如 Python,
  • 您能解释一下“静态类型”对您意味着什么吗?你有type inference吗?如何? (这应该进入你的问题)。多解释一下你的编程语言是什么样子的。

标签: c arrays data-structures struct interpreter


【解决方案1】:

阅读SICP,然后阅读Lisp In Small Pieces。它们很好地涵盖了您的问题。

您可能还想阅读Programming Language PragmaticsDragon Book

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

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

您不需要像 C 中那样简单的 union-s,而是需要 tagged unions 或 sum 类型。你当然想要garbage collector。你可以使用Boehm's GC

寻找简单的Scheme-like 解释器,例如here。学习SIOD

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

【讨论】:

    【解决方案2】:

    在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...这将是一个非常简单的开始。

    【讨论】:

    • 这如何回答这个问题?
    • @BasileStarynkevitch 是一种可以容纳 int 或 float 的对象类型
    • 这个只能存放int和float,不能存放数组、函数等
    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多