Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация стека ф-ции в интерпретаторе 
V
    Опции темы
sinmaster
Дата 29.7.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2008

Репутация: нет
Всего: нет



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

Код

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" пересослать на др индекс, чтобы она брала свое значение не из моей таблицы а из фрейма ф-ции. как бы вот этот шаг безболезненно сделать..?

большое всем спасибо.
PM MAIL   Вверх
JackYF
Дата 30.7.2008, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

Да.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 30.7.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



sinmaster, реализуй стек в своём интерпретаторе и не мучайся smile


--------------------
PM MAIL ICQ Skype   Вверх
sinmaster
Дата 30.7.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.7.2008

Репутация: нет
Всего: нет



тему можно закрывать. я разобралсяsmile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.