Привет все, я в настоящее время реализую простой язык программирования для полезного опыта, но я нуждаюсь в некотором совете. В настоящее время я разрабатываю свой Интерпретатор, и я вошел в проблему.
Мой язык является подмножеством C, и у меня есть проблема относительно реализации интерпретатора стека. На языке следующее скомпилирует:
somefunc ()
{
1 + 2;
}
main ()
{
somefunc ();
}
Теперь это в порядке, но когда "1+2" вычисляется, результат продвинут на стек и затем функциональные возвраты, но на стеке существует все еще число, и не должно быть. Как я могу обойти эту проблему?
Я думал о сохранении "состояния" стека перед вызовом функции и восстановлением "состояния" после вызова функции. Например, сохраняя число элементов на стеке, затем выполните функциональный код, возвратитесь и затем появитесь от стека, пока у нас нет того же числа элементов как прежде (или возможно +1, если функция возвратила что-то).
Какие-либо идеи? Спасибо за любые подсказки!
Отличный вопрос! Одно из моих хобби - написание компиляторов для игрушечных языков, так что спасибо за отличный вкус в программировании.
Оператор выражения - это такой оператор, в котором код в операторе является просто выражением. Это означает все, что имеет форму <выражение> ;
, которая включает такие вещи, как присваивания и вызовы функций, но не if
s, while
s или return
s. В конце любого оператора выражения на стеке останется значение, которое следует отбросить.
1 + 2
- это оператор выражения, как и следующие:
x = 5;
При присваивании expression на стеке остается значение 5, поскольку результатом присваивания является значение левого операнда. После завершения выражения вы убираете неиспользуемое значение 5.
printf("hello world!\n");
printf() возвращает количество выведенных символов. Это значение останется в стеке, так что извлеките его, когда оператор завершится.
Фактически каждый оператор выражения оставляет значение в стеке, если только тип выражения не void
. В этом случае вы либо выделяете операторы void
в специальный регистр и ничего не выводите, либо помещаете в стек притворное значение "void", чтобы всегда иметь возможность вывести значение.
Вам понадобится более умный синтаксический анализатор. Когда вы видите выражение, значение которого не используется, вам нужно создать POP.