|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 262029. Ответов 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 Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|