|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 261682. Ответов 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
Пишем свой чекер |
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 01.10.2009, 23:35 [ТС] | |
|
В смысле негативные? Что-то не понял
В 33 ревизии прогонял тесты все,всё было ок вроде .. Может,там надо в скрипте указать --noinit-errors? А также если делаешь эталоны печати,тоже надо скрипт подправить.
0
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 01.10.2009, 23:42 [ТС] | |
|
А,ну так да,мы давно же обсуждали,что тесты лучше негативные делать,чтобы отлавливать правильно ошибки и если что править диалог с пользователем.
0
|
|
|
|
|
| 01.10.2009, 23:47 | |
|
Так надо иметь две группы тестов: позитивные и негативные. Позитивные должны нормально проходить интерпретацию и выдавать результат (и сравнивать его с эталоном). Вот про это я и говорил, что надо аккуратно эталонную печать править (изменился исходник теста, изменилась работа оператора PRINT, исправлена ошибка и т.п.). В первую очередь важно иметь хороший набор позитивных тестов
С негативными тестами как правило всё сложнее, но в твоём варианте вполне приемлимо. Заметил у тебя, что ошибки исполнения выдаются с неправильной привязкой к исходнику - с той, что соответствовала последнему токену. Поэтому в операторах я так же храню привязку, чтобы при сломе его исполнения выругаться правильно
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||
| 02.10.2009, 06:15 [ТС] | ||||||||||||||||
|
Сделал OPTION BASE <val>, а также теперь общая форма записи для DIM такая:
Пример исходника example
Ну всё,пока делаю for,do и твои опции trace попробую сделать.
0
|
||||||||||||||||
|
|
||||||
| 02.10.2009, 17:24 | ||||||
|
Тест на IF
1
|
||||||
|
|
||
| 03.10.2009, 10:48 | ||
|
1
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 04.10.2009, 07:25 [ТС] | ||||||
|
Столкнулся с небольшим затруднением в цикле FOR.Получается так,что мы должны знать начальное и конечное значения счётчика,а также шаг уже на момент интерпретации,чтобы правильно сгенерировать условие.Т.е получается,что выражения FOR i=A+B недопустимы,и после знака равно должна следовать константа,как максимум со знаком минус.Ведь по сути при генерации условия нужно знать значение в начале и в конце,их разницу,а также шаг.Потому что это влияет на то,каким будет условие (<= или >=).Смотрел в справку qbasic,вроде там тоже написано что обе границы должны быть <value>.Но как-то не особо расшифровано там.Мы же не можем менять весь подход к интерпретации cbranch только из-за одного цикла,а также некрасиво делать интерпретацию с подсчётом внутри синтаксического разборщика.Я не знаю,как лучше,просто решил пойти на такую уловку
Добавлено через 1 час 47 минут Вообще,сначала мне пришла в голову мысль просто как-то запихать нужную строку в поток считывания из исходника,предварительно сформировав её,просто немного коряво выглядит такое решение,не знаю,хороший ли это вариант..
0
|
||||||
|
|
|||||||||||
| 04.10.2009, 11:36 | |||||||||||
|
Я что-то трудностей не понял. Почему там должна быть константа?
1
|
|||||||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||
| 04.10.2009, 11:40 [ТС] | ||||||||||||
0
|
||||||||||||
|
|
||||||||
| 04.10.2009, 11:44 | ||||||||
|
Проверил на qbasic выражения поддерживает везде, кроме step'а. Т.е. всё равно общий синтаксис остаётся в виде
Добавлено через 1 минуту Добавлено через 47 секунд Говоря, что один код эквивалентен другому, я имею в виду, что конечное представление должно выглядеть точно так же.
1
|
||||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||
| 04.10.2009, 11:51 [ТС] | |||||||||||
|
Хорошо,поставим вопрос по -другому.На основании каких данных мы строим условие вручную,которого по сути нет в FOR(а нужно сгенерировать).Мы должны знать,какой знак отношения поставить между операндами.
То есть
0
|
|||||||||||
|
|
|
| 04.10.2009, 11:53 | |
|
> А на основании чего мы можем поставить этот знак?
На основания описания приинципа работы FOR. Проблему наконец просёк. Так же и просёк, почему в STEP допустима только константа. В итоге получается так, что если в STEP - положительная константа, то знак должен быть "<=", если отрицательная, то ">="
1
|
|
|
|
||||||
| 06.10.2009, 21:17 | ||||||
|
Для ревизии 38
Ещё есть ELSEIF. Для порядку его тоже надо бы поддержать. Я тоже что-то позабыл
1
|
||||||
|
|
||||||
| 09.10.2009, 13:54 | ||||||
|
Тест на ELSEIF
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 09.10.2009, 14:39 [ТС] | |
|
Попробовал пройти процесс создания Makefile'а с помощью GNU Autotools.Оно в этом проекте по ходу не надо,да?Я так понял,это для каких-то больших проектов.Или может всё-таки Makefile'ы могут быть разными на разных платформах?
Насчёт ELSEIF я немного не догоняю,разве это не будет увеличивать стек? Ведь нужно позаботиться,чтобы ELSEIF принадлежал определённому IF.
0
|
|
|
|
|||
| 09.10.2009, 15:59 | |||
|
1
|
|||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 09.10.2009, 16:24 [ТС] | |
|
Я имею ввиду что нельзя выйти из функции syntax_stmtNewCBranch до того,как создастся полная ветка IF ... END IF,этих ELSEIF ведь может быть очень много,... в смысле сделать цикл и добавлять ветки пока не увидим END IF,так что-ли?
0
|
|
| 09.10.2009, 16:24 | |
|
пишем свой троян с нуля Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать 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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|