![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
sinmaster |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
привет всем. я здесь новичёк.
в университете поставили задачу создать простейшийинтерпретатор языка программирования. почти что все уже я реализовал, но вот у меня сейчас встал вопрос касаемо реализации вызова ф-ций самих из себя. видимо, я что-то здесь пропустил и недореализовал, т.к. рекурсивные версии ф-ций не всеработают корректно в моем ЯП. скажем, если описать ф-цию фиббоначчи на моем языке:
то я получу некорректный дебаг вывод:
а ежели ф-цию по вычислению факториала числа, то получу верный дебаг вывод и результат
результат равен 120. (здесь не указал просто) я так понимаю, я не предусмотрел создание при кажд вызове ф-ции её фрейма, чтобы при кажд новом её вызове аргументы ф-ции были бы независимы от аргументов которые были переданы в ф-цию в её предыдущем вызове. сейчас у меня при кажд вызове ф-ции используются одни и те же аргументы (переменные лежащие в таблице), и ,после первого прогона ф-ции fib(n-1) в n заносится 0, и далее в вызов fib(n-2) заносится уже нуль, а не значение вычисленное относительно оригинального значения параметра n. отсюда и баг. вопрос -- правильно ли я догадываюсь, что мне надо реализовать копирование значений аргументов при каждом рекурс. вызове ф-ции в свою область, "фрейм", чтобы они были независимы между др др?? (так досадно, все реализовал, а вот с функциями недогоняю...а на лекциях эти тонкости не разобрали мы, потому не знаю что и предприняыть). сейчас у меня класс "функция" содержит вектор переданных аргументов. фактически это вектор содержащий индексы переменных, которые лежат все в одной глобальной таблице. а на стадии синтаксич. разбора я пробежался по прототипу определенной пользователем ф-ции, создал в таблице переменные. и далее при синтаксич. разборе тела этой ф-ции я проверяю каждое использование переменной на наличие ее в этой таблице. если нету — выдаю ошибку "undefined identifier". я это к тому что void f(int x){ if (x==1){...} ... } вот здесь у меня в теле ф-ции переменная "x" и переменная "x" объяваленная в параметрах этой ф-ции имеют один и тот же индекс в таблице переменных... если я сейчас прикручу использование вышеописанного "фрейма/стека" для вызова ф-ции, то получается что мне каким-то образом нужно будет в теле ф-ции ту же переменную "x" пересослать на др индекс, чтобы она брала свое значение не из моей таблицы а из фрейма ф-ции. как бы вот этот шаг безболезненно сделать..? большое всем спасибо. |
||||||||
|
|||||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
sinmaster, реализуй стек в своём интерпретаторе и не мучайся
![]() |
|||
|
||||
sinmaster |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
тему можно закрывать. я разобрался
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |