如何在解释器中实现数组?

时间:2010-05-11 17:30:11

标签: c++ interpreter

我设法写了几个口译员,包括

  • 标记化
  • 解析,包括更复杂的表达式,例如((x+y)*z)/2
  • 从语法树构建字节码
  • 实际字节码执行

我没有管理的内容:dictionaries/lists/arrays的实施。

我总是把多个值放到一个变量中。

我的值结构(用于传递的所有值,包括变量)如下所示,例如:

class Value
{
public:
 ValueType type;

 int integerValue;
 string stringValue;
}

使用整数和字符串工作正常,但我怎样才能实现数组?

(从现在开始array我的意思是我的实验语言中的数组,而不是C ++中的数组)

  • 如何将数组概念融入上面的Value类?有可能吗?

  • 我应该如何使用上面的类来传递数组,就像使用我的语言传递整数和字符串一样?

访问数组元素或内存分配不是问题,我只是不知道如何存储它们。

3 个答案:

答案 0 :(得分:3)

我认为你需要额外的抽象层。

您的'变量'应该使用您正在构建的语言为某个内部对象与“名称”的绑定建模。 “对象”应该对表示进行建模。

这样,变量可以容纳任何东西,它是一个“变体”。某种Object可能包含其他对象的数组。

提示:

class Object {
public:
   enum etype { cInt, cString, cArray, cDictionary };
   virtual etype type() const = 0;
   virtual ~Object(){} // don't forget virtual destructor
   // maybe some reference counter functions?...
};

class Variable {
public:
    string name;
    Object* value;
};

class Array : public Object {
   std::map<size_t, Object*> objects_; //or smart pointers...
public:
   virtual etype type() const { return cArray; }
   Object* get( size_t i ) const { return objects_[i]; }
   void put( size_t i, Object* o ) { objects_[i] = o;  }
};

class Int : public Object {
public:
    virtual etype type() const { return cInt; }  
    int value_;
};

答案 1 :(得分:2)

如果我这样做,剩下的就足够了吗?

class Value
{
public:
 ValueType type;

 int integerValue;
 string stringValue;
 vector<Value> arrayValue;
}

答案 2 :(得分:0)

你的Value类型可以是一个指向基类的(智能)指针,你可以从中导出整数,字符串,字典,...的类。