| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > реализация стека ф-ции в интерпретаторе |
| Автор: sinmaster 29.7.2008, 22:34 | ||||||||
| привет всем. я здесь новичёк. в университете поставили задачу создать простейшийинтерпретатор языка программирования. почти что все уже я реализовал, но вот у меня сейчас встал вопрос касаемо реализации вызова ф-ций самих из себя. видимо, я что-то здесь пропустил и недореализовал, т.к. рекурсивные версии ф-ций не всеработают корректно в моем ЯП. скажем, если описать ф-цию фиббоначчи на моем языке:
то я получу некорректный дебаг вывод:
а ежели ф-цию по вычислению факториала числа, то получу верный дебаг вывод и результат
результат равен 120. (здесь не указал просто) я так понимаю, я не предусмотрел создание при кажд вызове ф-ции её фрейма, чтобы при кажд новом её вызове аргументы ф-ции были бы независимы от аргументов которые были переданы в ф-цию в её предыдущем вызове. сейчас у меня при кажд вызове ф-ции используются одни и те же аргументы (переменные лежащие в таблице), и ,после первого прогона ф-ции fib(n-1) в n заносится 0, и далее в вызов fib(n-2) заносится уже нуль, а не значение вычисленное относительно оригинального значения параметра n. отсюда и баг. вопрос -- правильно ли я догадываюсь, что мне надо реализовать копирование значений аргументов при каждом рекурс. вызове ф-ции в свою область, "фрейм", чтобы они были независимы между др др?? (так досадно, все реализовал, а вот с функциями недогоняю...а на лекциях эти тонкости не разобрали мы, потому не знаю что и предприняыть). сейчас у меня класс "функция" содержит вектор переданных аргументов. фактически это вектор содержащий индексы переменных, которые лежат все в одной глобальной таблице. а на стадии синтаксич. разбора я пробежался по прототипу определенной пользователем ф-ции, создал в таблице переменные. и далее при синтаксич. разборе тела этой ф-ции я проверяю каждое использование переменной на наличие ее в этой таблице. если нету — выдаю ошибку "undefined identifier". я это к тому что void f(int x){ if (x==1){...} ... } вот здесь у меня в теле ф-ции переменная "x" и переменная "x" объяваленная в параметрах этой ф-ции имеют один и тот же индекс в таблице переменных... если я сейчас прикручу использование вышеописанного "фрейма/стека" для вызова ф-ции, то получается что мне каким-то образом нужно будет в теле ф-ции ту же переменную "x" пересослать на др индекс, чтобы она брала свое значение не из моей таблицы а из фрейма ф-ции. как бы вот этот шаг безболезненно сделать..? большое всем спасибо. |
| Автор: Любитель 30.7.2008, 13:29 |
| sinmaster, реализуй стек в своём интерпретаторе и не мучайся |
| Автор: sinmaster 30.7.2008, 21:00 |
| тему можно закрывать. я разобрался |