Как реализовать массивы в интерпретаторе? - PullRequest
2 голосов
/ 11 мая 2010

Мне удалось написать несколько переводчиков, включая

  • Tokenizing
  • Парсинг, включая более сложные выражения, такие как ((x+y)*z)/2
  • Построение байт-кода из синтаксических деревьев
  • Фактическое выполнение байт-кода

Что мне не удалось: Реализация dictionaries/lists/arrays.

Я всегда зацикливался на получении нескольких значений в одной переменной.

Моя структура значений (используется для всех передаваемых значений, включая переменные) выглядит следующим образом, например:

class Value
{
public:
 ValueType type;

 int integerValue;
 string stringValue;
}

Отлично работает с целыми числами и строками, но как я могу реализовать массивы?

(Отныне с array я имею в виду массивы на моем экспериментальном языке, а не на C ++)

  • Как я могу вписать концепцию массива в класс Value выше? Возможно ли это?

  • Как мне сделать так, чтобы массивы могли передаваться так же, как вы можете передавать целые числа и строки в моем языке, используя класс выше?

Доступ к элементам массива или выделению памяти не будет проблемой, я просто не знаю, как их хранить.

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Я думаю, вам нужен дополнительный слой абстракции здесь.

Ваша «переменная» должна моделировать привязку некоторого внутреннего объекта с «именем» на языке, который вы создаете. «Объект» должен моделировать представление.

Таким образом, переменная может содержать что угодно, это «вариант». Объект определенного типа может содержать массив других объектов.

Подсказка:

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_;
};
2 голосов
/ 11 мая 2010

Если я это сделаю, достаточно ли легко все остальное выполнится?

0 голосов
/ 11 мая 2010

Ваш тип Value может быть (умным) указателем на базовый класс, из которого вы будете получать классы для целых чисел, строк, словарей, ...

...