#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
||||||||||||||||||||||||||||||||||||||||||||||
#1 | ||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC - C++20.06.2009, 20:03. Просмотров 195957. Ответов 464
Метки нет Все метки)
(
*****************
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC. Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой. Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz Если кто-то пользуется Subversion,скачать исходники можно так: Код
svn co https://basin.svn.sourceforge.net/svnroot/basin basin Технический приём для формирования согласованных данных Makefile: как с использованием gcc строить автоматические зависимости от .h файлов? Вопрос по svn (Subversion) Создание системы тестирования ПО. Вопрос про разные реализации бэйсиков Можно ли выразить порядковый номер элемента массива через индексы? [C++] Какие флаги указать линкеру для компиляции программы? Как можно определить переменную в файле configure.in,чтобы её можно было использовать в Makefile? Странный SIGSEGV, или что зависит от порядка написания интерфейса класса Можно ли как-то указать в Makefile, чтобы часть файлов компилировал компилятор C? Альтернативная версия интерпретатора от Evg на C Это простая реализация разбора выражений, написанная Evg на C: Представление выражения в двоичном дереве ***************** Первое сообщение: ***************** Задание(Страуструп,из книги,по готовому коду): Введите программу калькулятора и заставьте её работать.Например,при вводе
LexicalAnalyzer.h
LexicalAnalyzer.cpp
main.cpp
Анализатор-то работает,но конечное значение не вычисляется.Более того,если вводим
Добавлено через 2 часа 5 минут 30 секунд Пришлось решать влоб с дебаггером.У Страуструпа опечатка (или намеренная ошибка,что более вероятно ![]()
Добавлено через 16 минут 19 секунд И ещё опечатка была
31
|
|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
|
20.06.2009, 20:03 |
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Пишем свой интерпретатор языка BASIC (C++):
464
Пишем свой чекер - C++ пишем свой троян с нуля - C++ Пишем свой класс, спецификатор доступа protected - C++ Не удается откомпилировать интерпретатор М-языка - C++ Интерпретатор небольшого языка программирования на С++ - C++
|
Evg
![]() ![]() |
|
16.09.2009, 16:33 | #121 |
Насколько я понял, в момент интерпретации IF'а для одной из его веток ты вызываешь interp_Run.
Доходишь до метки. Далее делаешь переход на метку. Опять попадаешь в interp_stmtIF. В итоге получается бесконечная рекурсия Добавлено через 12 минут Ну и вообще я так с ходу не совсем пойму, как GOTO внутри IF'а отработает. По логике вещей при окончании списка мы должны вернуться из процедуры interp_Run Код
LET B1 = 5 IF B1 THEN GOTO 2 PRINT B1+1 2: PRINT B1+2
1
|
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
|
16.09.2009, 17:29 [ТС] | #122 |
Только вот как? GOTO же требует,чтобы выполнялся оператор за меткой,так вроде логично что это уже на плечах программиста .Как можно вернуться из инструкции,если управление передаётся опять на IF?Что-то не пойму .
А,я понял что ты имел ввиду походу ![]() ![]()
0
|
Evg
![]() ![]() |
|
16.09.2009, 17:32 | #123 |
Я просто не могу чётко сформулировать свою мысль, т.к. в деталях не знаю, как у тебя работает. Попробуй для начала вышеобозначенные ошибки исправить, может самому станет понятно
1
|
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
|
16.09.2009, 19:28 [ТС] | #124 |
Я кажись понял
![]() Я вот думаю,как можно это поправить "малой кровью" =) Может,сделать чтобы все интерпретирующие функции возвращали порядковые номера в глобальном списке,по умолчанию свои,а если идёт передача управления(как у GOTO),то номер инструкции в списке,которая должна интерпретироваться следующей.. В-общем у меня ощущение,что в целом направление правильное(отдельные списки для WHILE и IF,проверка синтаксиса в них),но я не уверен.
0
|
Evg
![]() ![]() |
|
16.09.2009, 20:14 | #125 |
Тут беда не только в том, что нет номера в списке, а ещё и в том, то у тебя возникает рекурсия. Т.е. после GOTO ты по сути дела начинаешь по новой интерпретировать самый верхний список операторов (поскольку метка в начале программы). Но этот список ты уже интерпретируешь внутри второй активации RunList - т.е. когда ты попадаешь в операцию присваивания и в этом месте смотришь стек интерпретатора, то получается, что с каждым попадением в эту точку стек у тебя растёт. Либо я как-то не так представляю, как у тебя работает, но на первый взгляд получается именно так
1
|
Nikita2009
103 / 102 / 6
Регистрация: 12.09.2009
Сообщений: 453
|
|
16.09.2009, 21:07 | #126 |
0
|
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
|
16.09.2009, 22:37 [ТС] | #127 |
Книга называется "Язык программирования С++" Б.Страуструп.Специальное издание.
Но по сути,исходники программы,получившейся в итоге,довольно далеки от книжной версии.
1
|
Nikita2009
103 / 102 / 6
Регистрация: 12.09.2009
Сообщений: 453
|
|
16.09.2009, 22:46 | #128 |
На сколько далеки???
0
|
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
|
16.09.2009, 22:55 [ТС] | #129 |
Ну возьми книгу и сравни с исходниками последней версии тут http://basin.svn.sourceforge.net/
По сути-это совешенно другая программа,и общего между ними - только то,что способ рекурсивного спуска при разборе выражений - тот же.
0
|
Nikita2009
103 / 102 / 6
Регистрация: 12.09.2009
Сообщений: 453
|
|
16.09.2009, 23:12 | #130 |
Ага, спасибо...
Добавлено через 15 минут А о такой книге слышал что нибудь ?? Харви Дейтл, Пол Дейтл "Как програмировать на C++" Говорят что хорошая...
1
|
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
|
|
17.09.2009, 00:40 [ТС] | #131 |
Я слышал плохое ...
Я попытаюсь понять как это исправить ... Но в общем я вижу это не как рекурсию,но склонен доверять тебе,постараюсь понять..
0
|
Evg
![]() ![]() |
|
17.09.2009, 08:10 | #132 |
Давай тогда добейся того, чтобы для начала эти примеры заработали, а там видно будет. Просто это одно из моих предположений, которое я надумал, пока тебе объяснял принцип построения промежуточного представления
1
|
Evg
![]() ![]() |
|
17.09.2009, 18:36 | #134 |
У меня gcc-4.2.1
Ревизия 21 ломается на компиляции (линковке) Код
syntax.o: In function `syntax_IdentRValue()': syntax.cpp:(.text+0x309f): undefined reference to `defined_arrays' syntax.cpp:(.text+0x30aa): undefined reference to `FindNameOverVector(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Array*, std::allocator<Array*> >&)' syntax.o: In function `syntax_StmtLET(std::vector<Statement*, std::allocator<Statement*> >*)': syntax.cpp:(.text+0x387c): undefined reference to `defined_arrays' syntax.cpp:(.text+0x3887): undefined reference to `FindNameOverVector(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Array*, std::allocator<Array*> >&)' syntax.o: In function `syntax_stmtDIM(std::vector<Statement*, std::allocator<Statement*> >*)': syntax.cpp:(.text+0x3f0d): undefined reference to `defined_arrays' syntax.cpp:(.text+0x3f18): undefined reference to `FindNameOverVector(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Array*, std::allocator<Array*> >&)' syntax.cpp:(.text+0x4159): undefined reference to `Array::Array(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Types)' syntax.cpp:(.text+0x42e7): undefined reference to `defined_arrays' interp.o: In function `interp_stmtDIM(Statement const*)': interp.cpp:(.text+0x33c0): undefined reference to `defined_arrays' interp.cpp:(.text+0x33cb): undefined reference to `FindNameOverVector(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Array*, std::allocator<Array*> >&)' interp.cpp:(.text+0x344e): undefined reference to `defined_arrays' interp.cpp:(.text+0x3461): undefined reference to `Array::SetDimensions(std::vector<unsigned long, std::allocator<unsigned long> >*)' interp.cpp:(.text+0x346f): undefined reference to `defined_arrays' interp.cpp:(.text+0x347e): undefined reference to `Array::ArrZeroInit()' interp.cpp:(.text+0x348c): undefined reference to `defined_arrays'
1
|
Evg
![]() ![]() |
|
18.09.2009, 14:42 | #135 |
revision 21 на оригинальном исходнике ломается "file: source.bas line: 23 error: Unexpected symbol". Там в конце строки символ '\r'. Его надо уметь пропускать
0
|
18.09.2009, 14:42 | |
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
|
18.09.2009, 14:42 |
Привет! Вот еще темы с ответами:
135
Написать интерпретатор программного языка -помощь - C++ Интерпретатор/компилятор ассемблер-подобного языка - C++ Интерпретатор музыки стандарта BASIC PLAY на С++ - C++ Задание: разработать "Интерпретатор языка". С чего начать? - C++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |