|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 261085. Ответов 464
Метки нет (Все метки)
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC.
Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой. Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz Если кто-то пользуется Subversion,скачать исходники можно так:
Технический приём для формирования согласованных данных https://www.cyberforum.ru/c-linux/thread46096.html Вопрос по svn (Subversion) Создание системы тестирования ПО. Вопрос про разные реализации бэйсиков Можно ли выразить порядковый номер элемента массива через индексы? [C++] Какие флаги указать линкеру для компиляции программы? Как можно определить переменную в файле configure.in,чтобы её можно было использовать в Makefile? Странный SIGSEGV, или что зависит от порядка написания интерфейса класса https://www.cyberforum.ru/c-linux/thread61324.html Альтернативная версия интерпретатора от Evg на C Это простая реализация разбора выражений, написанная Evg на C: Представление выражения в двоичном дереве ***************** Первое сообщение: ***************** Задание(Страуструп,из книги,по готовому коду): Введите программу калькулятора и заставьте её работать.Например,при вводе
LexicalAnalyzer.h
LexicalAnalyzer.cpp
main.cpp
Анализатор-то работает,но конечное значение не вычисляется.Более того,если вводим
Добавлено через 2 часа 5 минут 30 секунд Пришлось решать влоб с дебаггером.У Страуструпа опечатка (или намеренная ошибка,что более вероятно ) Вот в этом куске кода в функции get_token():
Добавлено через 16 минут 19 секунд И ещё опечатка была
31
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| 20.06.2009, 20:03 | |
|
Ответы с готовыми решениями:
464
Пишем свой интерпретатор языка BASIC
Пишем свой чекер |
|
|
||||||||||||
| 20.12.2009, 14:11 | ||||||||||||
|
Скачиваешь, пишешь make. Запускаешь "./basin source.bas" Только нужно будет libSDL установить Добавлено через 15 минут Правда последняя версия из-под cvs у меня что-то не компилится
2
|
||||||||||||
| 20.12.2009, 14:14 | |
|
Не по теме: Выполнил make. Всё собралось как надо, потом выполнил make clean и basin тоже удалился. Т.е. остаются только исходники. Так задумано?
1
|
|
|
|
|||
| 20.12.2009, 14:20 | |||
|
1
|
|||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|||
| 20.12.2009, 14:23 | |||
|
1
|
|||
|
|
|||
| 20.12.2009, 14:33 | |||
|
Добавлено через 3 минуты RazorQ, может ты знаешь, чего надо в убунте нажать, чтобы qt установилось?
1
|
|||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 20.12.2009, 14:35 | |
|
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 20.12.2009, 20:24 [ТС] | ||||||
|
Ой,сколько интересного я пропустил
![]() Ну во-первых,спасибо RazorQ за инициативу с помощью.В принципе я хотел сделать сам,но в-общем я уже сделал какой-то минимальный GUI,выглядит сейчас так: ![]() Окно с ошибками теперь показывается только когда они есть. Т.е. заготовка есть (хотя по большому счёту там просто слепленные примеры с документации Qt4).Поковырявшись с Qt4,я примерно понял,как с ней работать,мне этого достаточно,так что можно даже полностью переделать GUI (только надо позаботиться,чтобы первоначальный вариант не пропал) У меня есть несколько альтернатив решения этого вопроса. 1) Можно просто скачать исходники отсюда http://basin.svn.sourceforge.net/viewvc/basin/ там внизу есть ссылка на tar-ball.Это будет всегда последняя версия репозитория. 2) Скачать через svn тут https://sourceforge.net/projects/basin/develop В этих случаях придётся как-то менятся исходниками потом. 3) По идее я бы мог добавить для RazorQ свою ветку в svn-репозитории,а также права на доступ,на странице проекта эту ветку видно не будет,но знающие смогут скачать,зная адрес. 4) Можно добавить git-репозиторий,а также cvs,и это будет как отдельная ветка. 5) Ну или ещё какой-нибудь вариант. Насчёт пропадания окошка - там нужно нажать любую клавишу,и окно пропадёт.Просто я не знал,как правильно сделать это в SDL,и добавил в деструктор код по отлавливанию нажатия любой клавиши(по идее костыль): выглядит так (graphics.cpp)
P.S. на счёт написанного Evg про функции,надо подумать,потом я ответ напишу. >Evg, ты не мог бы дать мне список ключевых слов и саму программку. Я пока поэкспериментирую. Кстати,у нас разные версии интерпретаторов,у Evg-на C,у меня - смесь С и С++ (основной костяк промежуточного представления я взял из версии Evg ). Добавлено через 10 минут Мой список синтаксиса есть в файле SYNTAX,который прилагается к проекту,вот на него ссылка - http://basin.svn.sourceforge.n... iew=markup
0
|
||||||
|
|
||
| 20.12.2009, 23:11 | ||
|
> У меня есть несколько альтернатив решения этого вопроса. Для начала можно просто отдать RazorQ'у исходники, а он из нич что-то склепает. Если тебе понравится - включишь в свой репозиторий и будешь думать, как доступ организовывать. Даже если пароль взломают - всего можно будет откатить на нормальную версию, ибо взломанным паролем можно только испортить исходники, но нельзя испоганить хранилище (по идее)
1
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||
| 20.12.2009, 23:26 [ТС] | ||
|
Под виндой надо читать доку,как скомпилить Qt4 там что-то вроде запускаешь config,указываешь платформу(компилятор) ,и всё должно скомпилиться. Самое правильное - запусти ./configure скрипт,он должен все зависимости выявить,и что нужно поставь.
0
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||
| 20.12.2009, 23:59 [ТС] | |||||||
0
|
|||||||
|
|
||||||||||||||
| 21.12.2009, 00:07 | ||||||||||||||
[code]g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o editor.o editor.cpp In file included from editor.cpp:22: editor.h:22:26: error: QPlainTextEdit: No such file or directory[code] Т.е. система конфигурации не подхватила правильные настройки установленного Qt из SDK (по крайней мере по части инклюдов) и полагается на то, что оно установлено по стандартным путям. Либо переменная QTDIR в нынешних версиях как-то по другому отрабатывается Сейчас я имею по сути две Qt: одну из SDK, установленную в /opt, другую установленную через "apt-get" по стандартным путям. В /opt/qtsdk-2009.04/qt/include/QtGui этот файл у меня есть, а в /usr/include/qt4/QtGui - нету Добавлено через 2 минуты До генерации qmake.pro у меня дело не дошло
1
|
||||||||||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 21.12.2009, 00:11 [ТС] | |
|
Ой,точно,я перепутал с configure скриптом ,это исправлю,правда как через configure проверить путь и сделать define,если интерпретатор ещё не собран? В-общем,там где-то по мелочи надо поменять,чтобы этот define делался после сборки первой цели.
0
|
|
|
|
|
| 21.12.2009, 00:17 | |
|
Хм... на ubuntu-9.10 всё нормально установилось, а проблема была на ubuntu-8.04.1
Добавлено через 3 минуты И даже запустилось В общем на мой взгляд IDE нужно вылизывать как минимум с пользовательской точки зрения (удобство пользования и т.п.). Если ты считаешь, что с Qt для самообразования более-менее разобрался, то имеет смысл отдать кому-то IDE на доработку и доведение до нормального пользовательского уровня. Короче, думай ![]() Добавлено через 2 минуты Кстати, ещё бы встроенный отладчик сделать надо. Хотя его надо делать только после того, как окончательно утрясётся с низкоуровневым представлением (если решишь всё-таки поддерживать функции)
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 21.12.2009, 06:32 [ТС] | |
|
Да,я не против,если RazorQ хочет сделать - пожалуйста,предоставлю любой из возможных вариантов.Можно и в главной ветке,какая разница,всё равно есть ревизии и т.п.,и кроме того,я уже не планировал добавлять что-то в сделанный GUI,а просто доделать его,там,сделать окошко настройки пути к интерпретатору,чтобы запоминалось в файле .conf,ну и ещё кое-какие мелочи.
А насчёт функций я так представляю - можно добавить переменную-указатель(и) на текущую функцию во всех Statements,при разборе её стек будет подаваться параметром ( у меня уже есть функция проверки отдельных блоков,можно до слова RETURN,или END SUB, или END FUNCTION),туда будут писаться все переменные,а при интерпретации в run-time эти указатели будут использоваться для поиска переменных,и придачи им начальных значений. Придётся,конечно,перелопатить пол-программы,но основной структуры это коснуться не должно. Evg,твоё предложение наверняка более рациональное,но я пока в него не очень въехал,надо покумекать ещё ![]() >могу помочь консультацией, советом, и на вопросы поотвечать Ну вот,ещё желающий помочь,спасибо,выслушаю советы =),хотя наверное доделывать будет RazorQ Добавлено через 5 часов 57 минут Сейчас подумал,наверное,попробую сделать так: Создаём таблицу функций.Минимальный размер таблицы единица и там будет создаваться главная функция.У неё глобальный стек переменных,массивов. Метки наверное стоит сделать только глобальными,но можно и локальные метки.В структуре Statements будет указатель на текущую функцию,в которой находится инструкция. Потом по мере создания представления,если встречается слово SUB или FUNCTION,создаётся функция а также её стеки,и указатель на неё передаётся дальше при провязывании в список или ещё как-то. Возможно,ещё придется где-то хранить указатель на предыдущую функцию,или просто переходить к предыдущей (они в одной таблице) после того как заканчивается построение представления для функции.Имя функции в программе - просто безымянная метка перехода на нужное место в памяти. При вызове функции считаются начальные значения параметров,присваиваются нужным переменным,и далее интерпретация идёт как обычно,только с той разницей,что переменные берутся из локального стека. Правда придётся организовать какую-то "кучу",или как там это называется,чтобы при рекурсивном вызове все предыдущие значения переменных вызывающей функции запоминались,а после вычислений брались значения с самого "верха". Можно сделать общий для всех функций контейнер только для тех переменных,которые передаются параметрами,и в нём и складировать все их значения при рекурсии... Или не общий,а для каждой функции по спец.контейнеру. Вот.
0
|
|
|
|
|
| 21.12.2009, 10:01 | |
|
По поводу функций. Твой вариант реализации - типичная затычка. Можешь его попробовать из тех же самый соображений - нужно испытать на себе неправильные варианты реализации.
То представление, которое мы имеем сейчас формально не совсем является представлением исходной программы. Statement'ы отражают операторы языка и на самом деле отражают языковые конструкции. Variable'ы точно так же отражают переменные языка. НО. Внутри Variable'ов у нас содержится Value, которое НЕ является конструкцией языка, а является run-time свойством программы. Таким образом сейчас в наше представление замешаны сразу две вещи: отображение исходной программы и отображение run-time состояния программы (которое в нашем случае является значением всех переменных). Пока мы имели простой язык без функций, технически "два в одном" выглядело просто и без сложных зависимостей компонент одна от другой. Когда появляются функции, то run-time состояние (т.е. значения всех переменных) больше не могут однозначно коррелировать с представлением программы, поскольку для каждой функции отображение программы только одно, а run-time состояний может быть несколько (по количеству активаций процедуры в стеке процедурных вызовов). Поэтому представление нужно выбирать таким образом, чтобы на один экземпляр представления процедуры легко привинчивалось несколько состояний переменных. Т.е. в представлении надо аккуратно отделить отображение языковых конструкций (statement'ы, expression'ы, variable'ы) от run-time сосотояния (Value'ы). Другими словами надо ввести некое понятие "память". И из каждой Variable должна торчать ссылка на Value, а вот сама Value должна храниться в "памяти". При этом к моменту запуска (начало фазы интерпретации) программы, в "памяти" уже расположены значения глобальных переменных. В "памяти" так же создаётся некое подобие стека. При входе в процедуру в этом стеке мы выделяем окно под количество переменных в процедуре и у всех Variable'ов процедуры настраиваем Value на этот стек. В конечном итоге представление вроде бы как остаётся одно, но в нём меняется механизм соответствия Variable и Value. Главное правильно отделить мух от котлет: представление программы отдельно, run-time состояние отдельно
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 21.12.2009, 11:00 [ТС] | |
|
Хорошо.Пока смутно,но понимаю,о чём ты толкуешь. Значит надо начать наводить какой-то порядок,чтобы потом было проще.Тогда я вернусь обратно на 71-ю ревизию и начну делать отладочные печати. Попробую сделать как надо. Дальше уже виднее будет.
Был такой вопрос у меня ещё- может,стоит сделать define-ы для доступа к полям структур представления? коли уж классы не использую,так зачем там пихать кучу ненужных функций.Там есть очень много таких,которые просто возвращают значение,и больше ничего не делают.
0
|
|
|
|
|||
| 21.12.2009, 13:04 | |||
|
1
|
|||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 21.12.2009, 15:31 | |
|
Разработка IDE идет полным ходом. Я раньше писал редактор с возможностью работы с несколькими документами, вот решил его взять за основу для будущей IDE. Немного просмотрел исходники Basin-IDE, которую написал #pragma, и позволю несколько замечаний:
1
|
|
| 21.12.2009, 15:31 | |
|
пишем свой троян с нуля Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|