Переводчик печатает на С - PullRequest
3 голосов
/ 29 мая 2010

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

Недавно я увидел небольшой интерпретатор C, который использовал очень простую структуру, подобную приведенной ниже, для всех своих объектов / значений в языке:

struct Object
{
    ubyte type;
    ubyte value;
};

Эта структура может содержать строки, целые числа, bools и списки (я думаю), используемые в языке, с которым работает интерпретатор.

  • Как вы можете заставить эту структуру Object содержать все эти типы?

Ответы [ 2 ]

2 голосов
/ 29 мая 2010

Как вы можете заставить эту структуру Object содержать все эти типы?

Он не содержит значения, он просто содержит идентификаторы / ссылки на значения, которые хранятся где-то еще.

1 голос
/ 06 марта 2012

Скорее всего, это сделано так, как предлагает sbi, поэтому структура интерпретатора будет выглядеть примерно так:

struct Object
{
    ubyte type;
    void* value;
};

Фактическое значение будет размещено где-то в куче, и когда объект будет создан, интерпретатор запишет тип в ubyte type. Позже функции заметят тип, используя object.type и присвоив ему значение этого типа, или просто предположят, что это был правильный тип, например:

useObjectAsString(Object toUse) 
{
    char* data = (char*)toUse.value;
}

Если у вас есть только несколько типов, которые вы хотите реализовать, вы также можете попробовать использовать union.

...