|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 257347. Ответов 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
Пишем свой чекер |
|
|
|||||||||||
| 23.12.2009, 21:52 | |||||||||||
|
Кстати, давно хотел сказать, но всё время забывал. Тот тест, который ты у меня взял, он у тебя коряво работает.
Вариант для моего интерпретатора
1
|
|||||||||||
|
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
|
|
| 23.12.2009, 22:33 | |
|
если что надо помогу с Хеллоу ворлд!
1
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 26.12.2009, 17:57 | |
|
Я в голове прокручиваю мысли по поводу дебагера и не могу представить себе этот процесс даже в теории. В чем я уверен, так это в том, что не нужно изобретать велосипед, т.е. писать свой интерпретатор (я как минимум морально не готов писать). С другой стороны каким образом отслеживать ход программы во время интерпретации? Отдавать на съедение basin по строчке кода? А как быть с циклами и ветвлениями? Может есть какая-то поддержка со стороны самого интерпретатора? Так же я пока не знаю, откуда мне можно будет получить список переменных и как обновлять их значения.
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 26.12.2009, 18:22 [ТС] | |
|
Я так думаю,что опираться мы будем на пользовательскую отладочную печать.Некое подобие уже реализовано в виде опций командной строки --trace-act,--trace-tree,--trace-silent,а также опций в самом коде с помощью инструкции OPTION. Проблема,я так понимаю,в остановке внутри самого интерпретатора по событию,зависящему от пользователя. Я вижу такое простое решение (хотя Evg наверняка его забракует) - в командную строку перед запуском интерпретатора подаются номера строк для остановки,а также имена нужных переменных для просмотра по какому-то согласованному формату.В этом случае интерпретатор будет останавливаться на этих строках в исходнике,параллельно печатая в stdout значения нужных переменных,и ожидая ввода пользователя (любую клавишу или enter).А уже IDE будет отлавливать эти значения,и показывать их,где нужно.
>откуда мне можно будет получить список переменных и как обновлять их значения. Это сделает сам пользователь ,и если они будут в той области видимости,то напечатаются,если нет,то нет ) Ну это дебаггер встроенный,а как делать внешний,я пока не знаю
1
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 26.12.2009, 18:39 | |
|
Хорошо. Всё же интерпретатор должен быть чистым (ИМХО), т.е. без встроенного отладчика. Но хотелось бы послушать, что скажет Evg, а я пока отложу написание дебагера.
1
|
|
|
|
|
| 26.12.2009, 19:04 | |
|
В случае компилятора отладчик возможно делать внешним, потому как по результату работы компилятора генерится независимый (от компилятора) исполняемый файл. В этот файл складывается отладочная информация, по которой отладчик может найти соотвествие между кодом (данными) и текстом исходной программы.
В случае интерпретатора отладчик может быть только встроенным, потому как независимо выполнять программу нет возможности. Как это выглядит внешне - могу попробовать расписать. Но вот вопрос - вы когда-нибудь работали с отладчиком gdb? Внешне должно выглядеть точно так же. За счёт того, что отладчик встроен в интерпретатор, то снимается более 90% геморроя, связанного с отладкой независимого приложения Добавлено через 9 минут В кратце выглядит примерно так. Запускается интерпретатор со специальной опцией, по которой интерпретатор начинает работать в интерактивном режиме. Т.е. он ожидает ввода команд с консоли. Пользователь пишет в управляющей консоли "break source.bas:30", что означет поставить брейкпоинт в файле source.bas в строке 30. Далее пользователь пишет "run", что означает запуск программы. По достижении указанного места интерпретатор перестаёт исполнять программу и опять ожидает ввода. Пользователь пишет "print A", интерпретатор распечатывает значение переменной "A". Ползтватель пишет "next", интерпретатор исполняет один оператор и опять вываливается в командную строку. И т.п. IDE должна делать по большому счёту то же самое. Когда пользователь жмёт мышкой на какую-то строку, то IDE должна отправить в интерпретатор команду "break ...". Когда пользователь жмёт правой кнопкой мышки над именем переменной и выбирает "Распечатать значение", то IDE отправляет интерпреатору приказ "print ..." и перехватывает результат. По такому же принципу работают все графические отладчики: есть некий низкоуровневый отладчик, а повер него строится графическая оболочка
2
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
||
| 26.12.2009, 19:05 | ||
|
Добавлено через 1 минуту Всё понял, спасибо
1
|
||
|
|
||
| 26.12.2009, 19:18 | ||
|
Как вариант вместо stdout, stderr можно открывать дополнительные файловые потоки, опять-таки чтобы не путать печати программы с выводом интерпретатора
1
|
||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 27.12.2009, 16:17 | |
|
Слушайте, а как называется ваш язык программирования? Я не стал перечитывать всю тему, может вы уже говорили об этом. Просто я всегда называю его Basic (именно так, а не BASIC), может я ошибаюсь.
1
|
|
|
|
|
| 27.12.2009, 18:03 | |
|
BASIC расшифровывается что-то типа "the Beginners All-sourpose Symbolic Instruction Code". Т.е. авторы взяли слово "basic" и сделали из него аббревиатуру. Поэтому провально писать все буквы заглавными. Диалектов бэйсика существует целая куча (грубо говоря, каждый разработчик делал немного по-своему). За основу мы брали Q-BASIC.
1
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 27.12.2009, 18:36 | |
|
Выкладываю наработки. Версия не совсем в рабочем состоянии, но я уже выбился из сил искать ошибку! Прошу откомпилировать, запустить и выключить. А потом рассказать мне о впечатлениях.
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 28.12.2009, 07:05 [ТС] | ||||||
|
Почему-то у меня не скомпилировалось.
Листинг ошибок (после того,как выполнил qmake,а затем make)
0
|
||||||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
||
| 28.12.2009, 10:09 | ||
0
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 28.12.2009, 14:50 [ТС] | |
|
А можно как-то без дизайнера обойтись? Я просто хочу скомпилить проект в консоли.. Ты скажи,что в исходнике поменять,я поменяю,или патч сделай,а то я что-то не въеду с этими кнопочками.
0
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 28.12.2009, 14:53 | |
|
#pragma, в таком случае просто удали строчку 88 из файла ui_mainwindow.h
1
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 28.12.2009, 14:59 | |
|
Я тут на коленке подправил
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 28.12.2009, 16:19 [ТС] | |
|
Посмотрел.Вроде бы ничего,красиво.Почему-то LINE идёт курсивом.Может,возьмешь регекспы из моей версии? Там впринципе почти готово было (ну может пару слов зарезервированных не было). Когда показывается окно с ошибками,неплохо бы,чтобы оно было поменьше,а то немного великовато на фоне общего размера окна.Я в своей версии не смог его сделать узкого размера,но так,чтобы его можно было растягивать.Поэтому сделал просто узкий фиксированный размер.У нас ведь интерпретатор показывает только одну ошибку за раз,и столько места не нужно. Можно ещё сделать выделение строки с ошибкой другим цветом,чтобы подчеркнуть,что что-то не так.
Ну и если можно,сделать сохранение файла настроек для Basin-IDE в ту же папку,где лежит проект,и чтобы ничего не сохранялось в домашнюю папку,а то я заметил,сохраняется какой-то .conf файл: зачем? У меня ещё такой вопрос есть: а для чего вообще эти ui файлы? Что они дают? Я без них как-то обходился,но в принципе и дизайнером не пользовался тоже.
0
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
||||||
| 28.12.2009, 16:29 | ||||||
![]()
Добавлено через 4 минуты Я тут статейку нашел. Там описывается создание интерпретатора языка Си. Собственно зачем даю ссылку - так хорошо расписан разбор и представление функций. http://lord-n.narod.ru/downloa... o_C/VI.htm
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||
| 28.12.2009, 16:47 [ТС] | ||||||||||||||||
|
Насчёт яркости,я так делал (тоже стырил из примеров):
По идее функции тоже надо выделять как ключевые слова,разве что цвет чуть чуть поменять.LINE ведь у нас идёт как Statement,а вот встроенные функции,которые учавствуют в выражениях,их бы надо по другому.
Вот список выделяемых слов.(могут быть забытые,но по идее все слова из parser.cpp в интерпретаторе нужно как-то выделять,кроме встроенных функций для выражений) список зарезервированных слов
1
|
||||||||||||||||
| 28.12.2009, 16:47 | |
|
пишем свой троян с нуля Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|