Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Пишем свой интерпретатор языка BASIC - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились:...
C++ Здравствуйте! Не могу поместить class в один файл с программой. file.hpp #include "Cat.hpp" // здесь классы "2)" Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() { http://www.cyberforum.ru/cpp-beginners/thread41186.html
Массивы строк C++
Привет всем! Задан массив строк. Как узнать который символ встечаетса найбольшое количество раз в етом массиве?
C++ вывод на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер
Please, help me!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) ...
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; ... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,222
Записей в блоге: 28
23.12.2009, 11:00
Цитата Сообщение от #pragma Посмотреть сообщение
Evg, я тут пытаюсь осмыслить всё вышесказанное с точки зрения технической реализации. Я дёрнулся наводить порядок,но нужно сначала представить,хотя бы примерно,как будет выглядеть программа дальше,и что конкретно в ней изменится. Про память я понял,но это касается больше стадии интерпретации run-time.
В теории промежуточное представление остаётся как есть, только вместо одной цепочки statement'ов мы имеем их несколько (на каждую процедуру). И меняется метод хранения value в переменных

Цитата Сообщение от #pragma Посмотреть сообщение
Мне непонятен такой момент. Вот в исходнике встречается слово SUB,после чего создаётся процедура со своими свойствами.Внутри исходника процедуры встречается некая переменная с именем.Понятно,что переменная содержит указатель на свой стек(если создана),как ты пишешь,но как мы узнаем по имени,в каком стеке(странице) искать переменную?Создавать ли новую или это глобальная переменная? А может,это ошибка пользователя и переменная уже есть,и она другого типа,ну и так далее. До слов END SUB все новые переменные нужно писать в определённую страницу,но как об этом узнает следующая функция,создающая представление программы? Просто ты написал,что мой вариант не верен,и теперь я немного сбит с толку,так как не представляю,как это будет выглядеть технически.В run-time вроде понятно,там уже будут не имена переменных,а объекты,и в них уже ссылки на нужные страницы,а вот при создании представления немного неясно.
В момент построения представления ты должен строить дополнительные списки переменных, относящихся к текущему контексту. Список содержит соотвестве имени и указателя на экземпляр класса Variable. Т.е. пока ты находишься ВНЕ процедур ты работаешь со списком, в котором у тебя находятся все глобальные переменные. Когда появляется новая переменная, то ты проверяешь в списке, есть ли уже такая переменная или нет. Если есть, то используешь её, если нет, заводишь новую. Когда ты зашёл в SUB, то заводишь дополнительный список (который удаляешь по выходу из SUB). Заметь, я говорю НЕ о списке переменных, а о списке соответствия имени и переменной. И когда встретил переменную, то проверяешь сначала локальный список, а потом глобальный. Если бы мы делали SUB'ы внутри SUB'ов, то пришлось бы заводить стек из списков, но такого в бэйсике вроде нет. Ещё надо уточнить, как там с локалами. Т.е. если первый раз переменная встретилась внутри SUB'а, то она является локальной или нет? Или все локальные переменные должны явно объявляться, а если встретилась необъявленная переменная, то она глобальная? В общем надо выяснить, как правильно делается в Q-бэйсике.

В итоге ты получаешь представление, которое по большому счёту ничем не отличается от текущего. Но у каждой процедуры надо иметь список локальных переменных. Когда ты в момент исполнения заходишь в процедуру, то проходишь по этому списку и все значения переменных копируешь "куда-то в строноу", после чего инициализируешь все переменные нулями (если в бэйсике для локалов это тоже должно выполняться). Это "куда-то" должно иметь стековую структуру. Таким образом если ты зашёл в процедуру рекурсивно, то этим действием ты спас старые значения переменных. Когда выполняешь возврат из процедуры, то из этого "куда-то" переписываешь значения обратно в переменные. Этим ты по сути моделируешь run-time стэк

Точку сохранения-восстановления можно изменить. Т.е. спасать не во время входа в процедуру, а в тот момент, когда внутри процедуры делается CALL, а спасать, соотвественно, когда ты вернёшься из этого CALL'а. Как получается технически проще, так и нужно делать.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru