Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > реализация стека ф-ции в интерпретаторе


Автор: sinmaster 29.7.2008, 22:34
привет всем. я здесь новичёк.
в университете поставили задачу создать простейшийинтерпретатор языка программирования. почти что все уже я реализовал, но вот у меня сейчас встал вопрос касаемо реализации вызова ф-ций самих из себя. видимо, я что-то здесь пропустил и недореализовал, т.к. рекурсивные версии ф-ций не всеработают корректно в моем ЯП.
скажем, если описать ф-цию фиббоначчи на моем языке:

Код

int fibbonachi(int n){
  print("n=");print(n); ##debug 
  if (n<=0){print("BUG");} ##debug
  if (n<=2){return 1;}
  return fib(n-1)+fib(n-2);
}

то я получу некорректный дебаг вывод:
Цитата

n=7n=6n=5n=4n=3n=2n=0BUGn=-2BUGn=-4BUGn=-6BUGn=-8BUG

а ежели ф-цию по вычислению факториала числа, то получу верный дебаг вывод и результат
Код

int fact(int x){
  if (x==0){return 1;}
  return x*fact(x-1);
}

Цитата

n=5n=4n=3n=2n=1n=0

результат равен 120. (здесь не указал просто)
я так понимаю, я не предусмотрел создание при кажд вызове ф-ции её фрейма, чтобы при кажд новом её вызове аргументы ф-ции были бы независимы от аргументов которые были переданы в ф-цию в её предыдущем вызове.
сейчас у меня при кажд вызове ф-ции используются одни и те же аргументы (переменные лежащие в таблице), и ,после первого прогона ф-ции fib(n-1) в n заносится 0, и далее в вызов fib(n-2) заносится уже нуль, а не значение вычисленное относительно оригинального значения параметра n. отсюда и баг.

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

сейчас у меня класс "функция" содержит вектор переданных аргументов. фактически это вектор содержащий индексы переменных, которые лежат все в одной глобальной таблице. а на стадии синтаксич. разбора я пробежался по прототипу определенной пользователем ф-ции, создал в таблице переменные. и далее при синтаксич. разборе тела этой ф-ции я проверяю каждое использование переменной на наличие ее в этой таблице. если нету — выдаю ошибку "undefined identifier".
я это к тому что void f(int x){ if (x==1){...} ... } вот здесь у меня в теле ф-ции переменная "x" и переменная "x" объяваленная в параметрах этой ф-ции имеют один и тот же индекс в таблице переменных...
если я сейчас прикручу использование вышеописанного "фрейма/стека" для вызова ф-ции, то получается что мне каким-то образом нужно будет в теле ф-ции ту же переменную "x" пересослать на др индекс, чтобы она брала свое значение не из моей таблицы а из фрейма ф-ции. как бы вот этот шаг безболезненно сделать..?

большое всем спасибо.

Автор: JackYF 30.7.2008, 01:10
Цитата(sinmaster @  29.7.2008,  21:34 Найти цитируемый пост)
вопрос -- правильно ли я догадываюсь, что мне надо реализовать копирование значений аргументов при каждом рекурс. вызове ф-ции в свою область, "фрейм", чтобы они были независимы между др др??

Да.

Автор: Любитель 30.7.2008, 13:29
sinmaster, реализуй стек в своём интерпретаторе и не мучайся smile

Автор: sinmaster 30.7.2008, 21:00
тему можно закрывать. я разобралсяsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)