|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 257122. Ответов 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
Пишем свой чекер |
|
|
||||||
| 16.09.2009, 16:33 | ||||||
|
Насколько я понял, в момент интерпретации IF'а для одной из его веток ты вызываешь interp_Run.
Доходишь до метки. Далее делаешь переход на метку. Опять попадаешь в interp_stmtIF. В итоге получается бесконечная рекурсия Добавлено через 12 минут Ну и вообще я так с ходу не совсем пойму, как GOTO внутри IF'а отработает. По логике вещей при окончании списка мы должны вернуться из процедуры interp_Run
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||
| 16.09.2009, 17:29 [ТС] | ||
|
А,я понял что ты имел ввиду походу выход там есть просто в interp_Run когда вызывается из IF -а подставляется ЛОКАЛЬНЫЙ список statement-ов,а statement из THEN всего один(только GOTO в нашем случае),и после этого происходит возврат из IF.Ну вроде так
0
|
||
|
|
||
| 16.09.2009, 17:32 | ||
|
1
|
||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 16.09.2009, 19:28 [ТС] | |
|
Я кажись понял
я ту ошибку исправил,но и правда с GOTO ошибка есть.Происходит это потому,что GOTO меняет значение счётчика,но это работает только для списка инструкций,по которому идёт интерпретация.Поэтому с IF получается,что происходит попытка проинтерпретировать инструкцию в списке,которой там нет(так как у THEN только одна инструкция,а именно GOTO).Отсюда и ошибка.Я вот думаю,как можно это поправить "малой кровью" =) Может,сделать чтобы все интерпретирующие функции возвращали порядковые номера в глобальном списке,по умолчанию свои,а если идёт передача управления(как у GOTO),то номер инструкции в списке,которая должна интерпретироваться следующей.. В-общем у меня ощущение,что в целом направление правильное(отдельные списки для WHILE и IF,проверка синтаксиса в них),но я не уверен.
0
|
|
|
|
|
| 16.09.2009, 20:14 | |
|
Тут беда не только в том, что нет номера в списке, а ещё и в том, то у тебя возникает рекурсия. Т.е. после GOTO ты по сути дела начинаешь по новой интерпретировать самый верхний список операторов (поскольку метка в начале программы). Но этот список ты уже интерпретируешь внутри второй активации RunList - т.е. когда ты попадаешь в операцию присваивания и в этом месте смотришь стек интерпретатора, то получается, что с каждым попадением в эту точку стек у тебя растёт. Либо я как-то не так представляю, как у тебя работает, но на первый взгляд получается именно так
1
|
|
|
105 / 104 / 9
Регистрация: 12.09.2009
Сообщений: 452
|
|
| 16.09.2009, 21:07 | |
|
0
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 16.09.2009, 22:37 [ТС] | |
|
Книга называется "Язык программирования С++" Б.Страуструп.Специальное издание.
Но по сути,исходники программы,получившейся в итоге,довольно далеки от книжной версии.
1
|
|
|
105 / 104 / 9
Регистрация: 12.09.2009
Сообщений: 452
|
|
| 16.09.2009, 22:46 | |
|
На сколько далеки???
0
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
| 16.09.2009, 22:55 [ТС] | |
|
Ну возьми книгу и сравни с исходниками последней версии тут http://basin.svn.sourceforge.net/
По сути-это совешенно другая программа,и общего между ними - только то,что способ рекурсивного спуска при разборе выражений - тот же.
0
|
|
|
105 / 104 / 9
Регистрация: 12.09.2009
Сообщений: 452
|
|
| 16.09.2009, 23:12 | |
|
Ага, спасибо...
Добавлено через 15 минут А о такой книге слышал что нибудь ?? Харви Дейтл, Пол Дейтл "Как програмировать на C++" Говорят что хорошая...
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||
| 17.09.2009, 00:40 [ТС] | |||
|
0
|
|||
|
|
||
| 17.09.2009, 08:10 | ||
|
1
|
||
|
|
||||||
| 17.09.2009, 18:36 | ||||||
|
У меня gcc-4.2.1
Ревизия 21 ломается на компиляции (линковке)
1
|
||||||
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
| 18.09.2009, 16:54 [ТС] | ||||||
|
Я первый раз слышу про такой символ.Что за символ и как пропускать?
UPD.А всё я прочитал надо просто в парсере добавить его.Просто интересно почему у тебя ломается,а у меня работало ... Насчёт GOTO я подумал,что всё таки лучше будет наверное работать по схеме,когда при интерпретации функция возвращает указатель на следующую инструкцию,я вот только не знаю как это сделать с IF THEN ELSE,в случае если есть ветка ELSE и нужно в конце ветки THEN указать,какой оператор следующий,как это определить на этапе синтаксиса.Что-то у меня каша в голове постоянно ![]() Или может завести какую-то глобальную переменную,показывающую номер текущей инструкции,чтобы проверялась каждый раз при интерпретации,и если есть GOTO,то в эту переменную пишется номер нужной инструкции в списке?Я сегодня точно посмотрю,как точно должна отрабатывать схема
Добавлено через 19 минут Как вообще туда попал этот символ '\r',вот что интересно..
0
|
||||||
|
|
|
| 18.09.2009, 17:10 | |
|
Ну просто у всех нормальных людей энетр кодируется одним символом "\n". А в DOS/Windows - двумя "\n\r" (или в обратном порядке, точно не помню). При открытии файла в текстовом режиме fopen (<name>, "r") эта пара символов на уровне системной библиотеки возвращается как один символ "\n", при записи в файл (и печати), соотвественно, наоборот. При окрытии файла в бинарном виде (т.е. в fopen подаётся "rb" вместо "r") такого читерства не делается. Как это в Си++ поддерживается - хз. Как этот символ попал в файл - скорее всего что-то правил под виндами
> Насчёт GOTO я подумал,что всё таки лучше будет наверное работать по схеме,когда при интерпретации функция возвращает указатель на следующую инструкцию Я так и делал - см. процедуру interp_InterpStatementBRANCH и место её вызова > я вот только не знаю как это сделать с IF THEN ELSE А потому я с этой помойкой и не заморачивался. Ввёл три операции управления: метка, условный переход и безусловный переход. И все языковые операторы управления (IF, WHILE, FOR) реализовал через эти три операции промежуточного представления - см. syntax_StatementIF. Если имеешь хоть какое-то понятие о том, как работает процессор на уровне системы команд или зоть как-то писал программы на ассемблере, то поймёшь, что здесь точно такая же логика - вся программа выстроена в виде цепочки операций, некоторые из которых являются операциями перехода (условного или безусловного)
1
|
|
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||
| 18.09.2009, 17:29 [ТС] | |||||||||||
|
Как этот символ правильно пропускать и,может,есть ещё какие-то поводные камни в этом направлении?Всякие там управляющие символы,последовательности и прочее?Что-то у меня не выходит,поскольку в потоке нет перевода строки,как то так получается,что слово PRINT в этом исходнике
И в том то и дело,что я под виндами вообще не сижу .. вот и не знаю,как и когда \r туда мог попастьДобавлено через 15 минут Я нашел как поправить.. но вопрос про всякие левые символы в силе.
0
|
|||||||||||
|
|
|||||||||||||||||||||||||||||||||
| 18.09.2009, 17:45 | |||||||||||||||||||||||||||||||||
|
Мой интерпретатор метки пока не поддерживает, но они неявно появляются в if'е. Грубо говоря, когда ты в структурном виде пишешь программу
Т.е. если для моей версии написать исходник
Добавлено через 6 минут
1
|
|||||||||||||||||||||||||||||||||
|
|
||||||
| 22.09.2009, 22:48 | ||||||
|
Появилось немного времени, сделал у себя поддержку меток и GOTO. Писал для своей реализации хитрожопый тест. Попробовал на твоей версии (с адаптацией под твой синтаксис) - заработало. Можешь тест добавить к себе в набор (не пропадать же ему)
И твоя и моя версия страдают недостатком выдачи диагностики - временами без поллитры не разберёшь, что оно хочет. Современные умные компиляторы позволяют более точно жиагностировать ошибку - они указывают не только номер файла и строки, но ещё и номер позиции в строке. Понятное дело, что сейчас это вообще не критично, но это ещё одна вещь, которая нужна для хорошего программного продукта - нормальный диалог с пользователем. Просто для порядка имей в виду Я так понимаю, что тестовый пример в репозитории отражает все поддерживаемые конструкции? Добавлено через 2 минуты Смотрю ты концепцию условных переходов переделал. Ты просто содрал или всё-таки разобрался, чем плох старый вариант? Добавлено через 11 минут В общем больше не получилось подобрать примеры, чтобы интерпретатор ломался или работал неправильно. В исходниках копаться уже совсем тяжело, так что пока прими поздравления: то, что уже есть, с виду работает так как надо
1
|
||||||
| 22.09.2009, 22:48 | |
|
пишем свой троян с нуля Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|