Реализация основанной на стеке виртуальной машины для подмножества C

Привет все, я в настоящее время реализую простой язык программирования для полезного опыта, но я нуждаюсь в некотором совете. В настоящее время я разрабатываю свой Интерпретатор, и я вошел в проблему.

Мой язык является подмножеством C, и у меня есть проблема относительно реализации интерпретатора стека. На языке следующее скомпилирует:

somefunc ()
{
    1 + 2;
}

main ()
{
    somefunc ();
}

Теперь это в порядке, но когда "1+2" вычисляется, результат продвинут на стек и затем функциональные возвраты, но на стеке существует все еще число, и не должно быть. Как я могу обойти эту проблему?

Я думал о сохранении "состояния" стека перед вызовом функции и восстановлением "состояния" после вызова функции. Например, сохраняя число элементов на стеке, затем выполните функциональный код, возвратитесь и затем появитесь от стека, пока у нас нет того же числа элементов как прежде (или возможно +1, если функция возвратила что-то).

Какие-либо идеи? Спасибо за любые подсказки!

7
задан Seki 13 June 2015 в 10:08
поделиться

2 ответа

Отличный вопрос! Одно из моих хобби - написание компиляторов для игрушечных языков, так что спасибо за отличный вкус в программировании.

Оператор выражения - это такой оператор, в котором код в операторе является просто выражением. Это означает все, что имеет форму <выражение> ;, которая включает такие вещи, как присваивания и вызовы функций, но не ifs, whiles или returns. В конце любого оператора выражения на стеке останется значение, которое следует отбросить.

1 + 2 - это оператор выражения, как и следующие:

  • x = 5;
    При присваивании expression на стеке остается значение 5, поскольку результатом присваивания является значение левого операнда. После завершения выражения вы убираете неиспользуемое значение 5.

  • printf("hello world!\n");
    printf() возвращает количество выведенных символов. Это значение останется в стеке, так что извлеките его, когда оператор завершится.

Фактически каждый оператор выражения оставляет значение в стеке, если только тип выражения не void. В этом случае вы либо выделяете операторы void в специальный регистр и ничего не выводите, либо помещаете в стек притворное значение "void", чтобы всегда иметь возможность вывести значение.

9
ответ дан 6 December 2019 в 22:59
поделиться

Вам понадобится более умный синтаксический анализатор. Когда вы видите выражение, значение которого не используется, вам нужно создать POP.

2
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: