|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 256981. Ответов 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
Пишем свой чекер |
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 28.12.2009, 16:55 | |
|
Ещё, я хочу сделать так: программист набирает ключевое слово, ставит пробел, а слово преобразовывается к одному стилю. Допустим, я набираю PrInT, а IDE меняет на Print. Всё это сделать, само собой, опционально. Как такая идея? И по поводу стиля: лично мне нравиться набирать зарезервированные слова с большой буквы, а здесь я вижу, что всё в верхнем регистре. Наверное, тоже надо вводить опцию.
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 28.12.2009, 17:02 [ТС] | |
|
Интерпретатор переводит все символы в верхний регистр перед использованием. Можно подражать той IDE что была для QBASIC - там текст переводился в верхний регистр,что бы пользователь не писал. Да,можно сделать опционально с разными стилями.
0
|
|
|
|
||
| 28.12.2009, 22:50 | ||
|
По поводу синтаксической подсветки. Чтобы интерпретатор знал поменьше о языке программирования, я бы в интерпретое завл специальную опцию, по которой он распечатывает в stdout все regexp'ы. Я толком не знаю, как это выглядит, то наверное в текстовом виде это представимо. И IDE бы дёргала интерпретатор и подхватывала этот набор.
Второй вариант - в процессе сборки интерпретатора генерить некий конфиг-файл (файл *.h или в любой другой форме, в которой это можно вкомпилить в исходник), в котором были бы описаны regexp'ы, а при сборке IDE этот файл подцеплять. Этот вариант хорош тем, что в код придётся затаскивать меньше всякого гавна. Но, если делать всё по-хорошему (когда мы формально имеем отдельно исходники интерпретатора, а отдельно исходники IDE), то в комплект поставки интерпреатора должен входить этот конфиг файл. Чтобы теоретические (гипотетические) IDE от других разработчиков лучше состыковывались с интерпретатором. Да и вообще описание всего интерфейса (с какими опциями запускать интерпретатор, как фильтровать выдачу и т.п.) можно построить на базе этих файлов, генерируемых в процессе сборки интерпретатора. Это сильно облегчит жизнь, когда надо будет в интерпреатторе что-то менять. Добавлено через 26 минут Добавлено через 5 минут При печати ошибки внизу у тебя пишется только текст ошибки. Хотя для порядку надо бы печатать имя файла и номер строки. Или на худой конец слово Error, а то нифига не понятно, что это за окошко внизу такое. Для порядку по опции можно печатать строку запуска интерпретатора (чтобы пользователь знал, как это повторить без IDE). Сделал код с ошибкой. Запустил. Оно сломалось и строка подсветилось - тут всё нормально. Ошибку исправил, запустил, но текст ошибки в нижнем окне остался. Перед каждым запуском нижнее окно надо чистить Добавлено через 2 минуты Когда после ошибочного запуска интерпретатора редактор позиционируется на строке с ошибкой, то строку было бы лучше выделать красным вместо синего (у людей врде что-то похожее сделано, только не помню точно, как именно)
2
|
||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
||
| 03.01.2010, 18:34 | ||
|
Позволю себе несколько замечаний по языку. К следующим заключениям я пришел после непосредственного использования языка и они (заключения) только лишь ИМХО:
Честно. Мне племянника надо подтягивать, сам люблю Basic - с ним можно расслабиться.
1
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||
| 04.01.2010, 09:49 [ТС] | |||||||||||
|
>У цикла while должно быть завершение аналогичное остальным конструкциям, т.е. end while. Я понимаю, что это связано с определенными трудностями, но тем не менее минус одно ключевое слово. Язык ведь для начинающих.
Я делал по тому,что написано тут и тут,там сказано,что окончание для while - это WEND. Про типы :сами названия в строковом представлении в интерпретаторе не используются.Это что-то древнее,которое придётся править.Тип VOID только для внутреннего представления,я его сделал как некий костыль,и значения этого типа могут принимать любой другой тип.Это по идее всего лишь флажок,обозначающий только что созданный объект Value. Слово FUNC тоже пережиток прошлых попыток с функциями,их было много. UNTIL: По идее цикл с DO должен выглядеть как
Для DIM тоже надо доделывать тот вариант,про который ты пишешь. Пока я пытаюсь перевести всю программу на классы,там такая каша,ещё поиск по стекам добавился,приходится делать правки вслепую,без компиляции.Потом,когда всё заработает,надо будет,конечно,исправить мелочи выше.
1
|
|||||||||||
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 04.01.2010, 11:01 | |
|
Всё. Вопросов нет. Спасибо.
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 18.03.2010, 23:18 [ТС] | |
|
Меняю построение синтаксиса DIM всвязи с запланированным добавлением функций (нужно добавить SHARED и[ AS type]),возник вопрос:
DIM ведь по сути ничего не делает,все части этой инструкции или имена переменных,или константы (в случае с измерениями массивов). С другой стороны,в DIM у меня присутствует некий элемент runtime - именно в этот момент во время интерпретации представления придаются свойства массиву и его элементы обнуляются. Вот я не знаю,стоит ли убрать DIM как часть представления вообще и во время построения содавать все переменные и массивы,часть из этих функций возложив на конструкторы? Или создание переменных следует считать runtime частью ? Моя туманная логика подсказывает,что переменные стоит создавать по мере их встречи в программе.
0
|
|
|
|
|
| 18.03.2010, 23:40 | |
|
Как оно устроено в реальных бэйскиах - я даже не знаю. Я у себя делал так, что DIM - это НЕ statement, а declaration. Т.е. на этапе синтаксического разбора сразу строился тип и переменная этого типа. Но насколько помню, на старых "продвинутых" версиях бэйсиков типа Yamaha в качестве размерности можно было задавать НЕ константу. Но я не помню, насколько это было свободным. Т.е. обязана ли была переменная (выражение) выступающая в качестве размерности массива на момент определения DIM иметь вычислимое значение. По факту во многих программах было что-то типа "LET N=10 ; DIM A(N)" и всё это объявлялось в начале программы. Так что тут надо курить документацию по бэйсику
Что такое SHARED и AS я тоже не знаю. Но из всего описания этого барахла в принципе можно будет понять, массив появляется в runtime или статически (на этапе трансляции)
1
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 21.03.2010, 11:06 | |
|
Извиняюсь, за столь долгую отлучку, но всё как-то не получалось. По сравнению с предыдущей версией эта много нового не внесла. Цель которую я преследовал: вытрясти максимально много ошибок. Так сказать, сделать базу на основе которой можно будет развивать программу. И я считаю, что можно присвоит этой программе версию 0.1
2
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 21.03.2010, 13:37 | |
|
niXman, спасибо. В BasinApplication::newMainWindow() действительно не нужно ещё раз выделять память. А вот где ещё нужно убрать new я так и не понял.
2
|
|
|
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
|
|
| 21.03.2010, 13:41 | |
|
2
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 21.03.2010, 21:45 [ТС] | ||||||
|
Скачиваю версию от niXman,пытаюсь разархивировать,пишет:
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 21.03.2010, 21:49 [ТС] | |
|
мм,хитро ты придумал) спасибо за идею
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||
| 21.03.2010, 22:25 [ТС] | ||||||||||||||||
|
Забавно,буду собирать )
У меня сразу возник вопрос: можно ли максимально упростить структуру файлов? Я имею в виду то,что мой интерпретатор собирается вместе с GUI по одной команде make (надо только доделать отмену сборки,если есть #define WITHOUT_GUI или подобное) Мой Makefile выглядит так: Makefile
а configure.in так configure.in
И в конце configure.in есть строчка копирования config.h из директории интерпретатора (autoheader принимает только один путь к config.h как я понял) в папку с GUI.То есть они используют один и тот же config.h,надо это как-то учесть(или придумать какой-то способ с одного конфигуратора генерировать все нужные файлы конфигов). А также то,что .pro файлы и все файлы,генерируемые автоматически лучше,наверное,исключить? Просто пользователю,скорее всего,удобнее один раз запустить configure ,и один раз make,чтобы всё собралось и все нужные файлы сгенерировались. Или принято,чтобы все эти файлы были в проекте? Что такое файлы .ts? они у меня не открываются ничем.А также файлы .qm, Doxyfile, .pro.user, .qrc (этот можно сгенерировать). Конечно,я могу сам "причёсывать" GUI,это не проблема,но просто было бы интереснее договориться,по крайней мере какое-то подобие соглашения должно быть насчёт сборки. Ведь лучше,чтобы всё собиралось просто,или может я тут неправ? Добавлено через 10 минут Что-то у меня не компилится,что подправить?
0
|
||||||||||||||||
|
|
|||
| 21.03.2010, 22:34 | |||
|
Добавлено через 1 минуту наверное 4.5.2 Добавлено через 31 секунду проверить так:
1
|
|||
| 21.03.2010, 22:34 | |
|
пишем свой троян с нуля Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне.
Это уже новая модель, модель сукцессии грибной.
потоки фосфора, азота. Углерода.
5 видов организмов.
Я даже. . .
|
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ
Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
|
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем
Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026
. . .
|
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки
План доработки модели динамики микоризных симбиозов (EcM с гистерезисом)
Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
|
|
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
|
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
|
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание:
как одно здание порождает конфликты требований,
которые никто не планировал
Материалы для обсуждения с МГСУ · 2026
Рисунки внутри приложенного ворд файла.
Что за. . .
|
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования?
Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная.
Где разрыв
. . .
|