Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 242557. Ответов 464
Метки нет (Все метки)
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC.
Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой. Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz Если кто-то пользуется Subversion,скачать исходники можно так: Код
svn co https://basin.svn.sourceforge.net/svnroot/basin basin Технический приём для формирования согласованных данных 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 Пишем свой strlen Пишем свой чекер пишем свой троян с нуля |
21.12.2009, 16:00 | 281 |
В той или иной степени это уже обсуждалось. Этот пункт из тех, что можно отлодить "на потом", т.к. на остальное он не должен влиять. Так же я на примере показывал, как правильно писать код, чтобы на низкий уровень можно было подкладывать любую библиотеку, а не только SDL
Насколько я понимаю, SDL сейчас не конфликтует с IDE?
1
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
21.12.2009, 16:04 | 282 |
1
|
21.12.2009, 16:06 | 283 |
В общем, полезно в репозиторий положить текстовый файл, куда сваливать идеи и полезные мысли, чтобы они не потерялись. Либо рисовать FIXME, но когда их много, что в отдельном файле проще
1
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
21.12.2009, 21:57 | 284 |
Вот самый черновой вариант программы. Назвал так же, Basin-IDE, т.к. это вольется в один проект. Для компиляции нужна Qt не ниже 4.5. Вообще это не жесткое ограничение, просто в этой версии появилась возможность добавлять кнопку закрытия на вкладку. Для работы программы, нужно наличие интерпретатора в том же каталоге. Насчет имен файлов: желательно чтобы путь к файлу не содержал пробелов и кириллицы (вообще это только в теории, сам не пробовал).
1
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
||||||
21.12.2009, 22:36 | 285 | |||||
Я, конечно, не прочитав документации решил написать самую элементарную программу на basic
Код
$ ./basin test.bas terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at Аварийный останов
1
|
21.12.2009, 22:47 | 286 |
RazorQ, неплохо, только отработку ошибок интерпретатора не сделал
Ну и чисто по мелочи замечания: - логически "undo" и "redo" должны находиться рядом с "cut", "copy", "paste" - у меня язык в системе выставлен английский, а все надписи по русски. Я так понимаю, что для многоязыковости надо отдельные локализации писать? Добавлено через 2 минуты Попробуй код без input'а, потому как подозреваю, что после реорганизации внутреннего представления input попросту слетел. Ну и синтаксис смотри по примеру или в каталоге tests, т.к. #pragma на строгость синтаксиса языка не вылизывал, потому как приоритетным было построение промежуточного представления. #pragma, соглашайся забрать этот IDE Он мне понравился
2
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
21.12.2009, 22:48 | 287 |
Это без вопросов
Да, надо писать файлы-переводчики. Это не сложно, но руки не доходят. У меня есть в планах сделать поддержку как минимум английского и русского. Но сейчас в коде жестко закодирован русский язык, поэтому английский ты увидишь только в сообщениях об ошибках.
1
|
RazorQ
|
21.12.2009, 22:57
#289
|
Не по теме: Вчера было полгода проекту! Поздравляю вас Evg и #pragma!
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
21.12.2009, 23:33 [ТС] | 290 | |||||
Выглядит неплохо - простенько,аккуратно и со вкусом. Мне понравилось. Я так быстро не умею
Кое-какие ньюансы(мелочи): если можно,добавь нужные регекспы для отображения текста более красочно,но,в принципе,если неохота,я доделаю. Комментарии наверное лучше чтобы становились серыми и с наклоном,как в С++,так лучше воспринимается основной текст,когда кореллирует с другим стилем. Ещё такую мелочь заметил:когда открывается окно программы,по умолчанию открывается поле нового файла,что,в принципе,верно,но если пользоваетль решает сразу открыть готовый исходник,то его лучше загружать в это же поле,так как оно остаётся висеть вкладкой просто так. Осталось только доделать эмулятор терминала,чтобы похож был на xterm и cmd (просто для подражания ) Ещё надо будет как-то сделать обработку ошибок интерфейсом,чтобы строку выделял цветом,или что-то навроде того,как я делал. В принципе,можно опираться на вывод интерпретатора,при ошибках он выведет строку,которая содержит слова "line: error:" и между ними должен быть номер строки. Там,правда,могут быть ньюансы с длинными путями,я не знаю,что будет,если длина строки окажется больше 255 символов. А так вообще всё классно! Иконки лучше ставить из твоего варианта,они менее агрессивны,и более приятны глазу,только нужно найти подходящие для run и interpret. Добавлено через 14 минут Нашел,где была ошибка,отправлю правку позже: кусок кода из syntax.cpp
Добавлено через 12 минут Ещё есть такая идея - сделать(опционально) автоотступ и показывать вертикалную линию после 80 знаков на строку для того,чтобы в результате код мог с удобством просматриваться в консоли,не требуя перемотки вправо .
1
|
22.12.2009, 09:55 | 291 |
Пока не забыл. В IDE надо сделать поиск и замену. При чём человеческие (вверх, вниз, case sensitive, whole word, regular expression, спрашивать или нет). При поиске уметь выделять все найденные подстроки. Так же "перейти на номер строки" и возможность включения нумерации строк (как в варианте #pragm'ы)
3
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
22.12.2009, 13:35 | 292 |
Я тоже У меня был недоделанный блокнот, вот я и взял его за основу.
Сделаю. Сейчас в подсветки синтаксиса только одна проблема: если ключевое слово находится в комментариях, то оно выделится как ключевое, а этого не должно быть. Возможно, нужно задать правильный regexp. Хорошо. Хотя честно, для меня это будет сложнее, т.к. с графикой в Qt не работал, но это дело времени Да, сам заметил. Подправлю.
2
|
22.12.2009, 16:38 | 293 |
1
|
22.12.2009, 20:02 | 294 |
#pragma тоже интерпретаторов не писал
> qscintilla ? Ой.. это я уже не знаю. Как говорится, пользователю нужен поиск и замена, а как он сдела технически - его это не колышет
2
|
22.12.2009, 20:13 | 295 |
Я к тому, что это ооочень навороченный виджет, и создан именно для редакторов. там есть все что только может понадобиться. он так же кроссплатформенный как и Qt.
т.е. писать велосипед с нуля, при условии что получится все равно хуже, смысла нет
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
23.12.2009, 09:47 [ТС] | 299 |
Evg, я тут пытаюсь осмыслить всё вышесказанное с точки зрения технической реализации. Я дёрнулся наводить порядок,но нужно сначала представить,хотя бы примерно,как будет выглядеть программа дальше,и что конкретно в ней изменится. Про память я понял,но это касается больше стадии интерпретации run-time.
Мне непонятен такой момент. Вот в исходнике встречается слово SUB,после чего создаётся процедура со своими свойствами.Внутри исходника процедуры встречается некая переменная с именем.Понятно,что переменная содержит указатель на свой стек(если создана),как ты пишешь,но как мы узнаем по имени,в каком стеке(странице) искать переменную?Создавать ли новую или это глобальная переменная? А может,это ошибка пользователя и переменная уже есть,и она другого типа,ну и так далее. До слов END SUB все новые переменные нужно писать в определённую страницу,но как об этом узнает следующая функция,создающая представление программы? Просто ты написал,что мой вариант не верен,и теперь я немного сбит с толку,так как не представляю,как это будет выглядеть технически.В run-time вроде понятно,там уже будут не имена переменных,а объекты,и в них уже ссылки на нужные страницы,а вот при создании представления немного неясно.
0
|
23.12.2009, 11:00 | 300 |
В теории промежуточное представление остаётся как есть, только вместо одной цепочки statement'ов мы имеем их несколько (на каждую процедуру). И меняется метод хранения value в переменных
В момент построения представления ты должен строить дополнительные списки переменных, относящихся к текущему контексту. Список содержит соотвестве имени и указателя на экземпляр класса Variable. Т.е. пока ты находишься ВНЕ процедур ты работаешь со списком, в котором у тебя находятся все глобальные переменные. Когда появляется новая переменная, то ты проверяешь в списке, есть ли уже такая переменная или нет. Если есть, то используешь её, если нет, заводишь новую. Когда ты зашёл в SUB, то заводишь дополнительный список (который удаляешь по выходу из SUB). Заметь, я говорю НЕ о списке переменных, а о списке соответствия имени и переменной. И когда встретил переменную, то проверяешь сначала локальный список, а потом глобальный. Если бы мы делали SUB'ы внутри SUB'ов, то пришлось бы заводить стек из списков, но такого в бэйсике вроде нет. Ещё надо уточнить, как там с локалами. Т.е. если первый раз переменная встретилась внутри SUB'а, то она является локальной или нет? Или все локальные переменные должны явно объявляться, а если встретилась необъявленная переменная, то она глобальная? В общем надо выяснить, как правильно делается в Q-бэйсике. В итоге ты получаешь представление, которое по большому счёту ничем не отличается от текущего. Но у каждой процедуры надо иметь список локальных переменных. Когда ты в момент исполнения заходишь в процедуру, то проходишь по этому списку и все значения переменных копируешь "куда-то в строноу", после чего инициализируешь все переменные нулями (если в бэйсике для локалов это тоже должно выполняться). Это "куда-то" должно иметь стековую структуру. Таким образом если ты зашёл в процедуру рекурсивно, то этим действием ты спас старые значения переменных. Когда выполняешь возврат из процедуры, то из этого "куда-то" переписываешь значения обратно в переменные. Этим ты по сути моделируешь run-time стэк Точку сохранения-восстановления можно изменить. Т.е. спасать не во время входа в процедуру, а в тот момент, когда внутри процедуры делается CALL, а спасать, соотвественно, когда ты вернёшься из этого CALL'а. Как получается технически проще, так и нужно делать.
1
|
23.12.2009, 11:00 | |
23.12.2009, 11:00 | |
Помогаю со студенческими работами здесь
300
Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка Интерпретатор музыки стандарта BASIC PLAY на С++ Написать интерпретатор программного языка -помощь Интерпретатор/компилятор ассемблер-подобного языка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |