Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||
Пишем свой интерпретатор языка BASIC20.06.2009, 20:03. Показов 242532. Ответов 464
Метки нет (Все метки)
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC.
Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой. Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz Если кто-то пользуется Subversion,скачать исходники можно так: Код
svn co https://basin.svn.sourceforge.net/svnroot/basin basin Технический приём для формирования согласованных данных 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 Пишем свой strlen Пишем свой чекер пишем свой троян с нуля |
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
|
|
11.06.2010, 00:19 | 381 |
Вот что у меня получилось:
3 типа переменных: int, string, bool, все глобальные, для них определены основные операции с приоритетами, кроме унарного минуса Ветвление if - else Цикл while, break Ветвления и циклы могут быть вложенными. В IDE пока работает только одна кнопка - запуск C#, Framework 2.0, кому интересен код - пишите в личку
4
|
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
|
|
22.06.2010, 20:53 | 383 |
Egeni, Возможно, но я сейчас пробую делать трансляцию в IL, получится .NET совместимый язык и по скорости не будет уступать остальным компилируемым языкам
0
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
09.08.2010, 23:06 [ТС] | 384 |
Evg ,у меня есть вопрос по теории. Допустим,мне удалось сделать вызов функций с помощью меток перехода,что не вызывает рекурсии в интерпретаторе.
В виде statements вызов функций тоже вроде не представляет проблем,даже рекурсивный. Но вот для интерпретации вызовов внутри выражений я пока не вижу решения,как избежать рекурсии внутри самого интерпретатора. Получается,что если функция учавствует в выражении (ведь реализация рекурсии имеет смысл только при использовании возвращаемого значения,так?), то нужно как-то запомнить все предыдущие состояния вычислений,и или сложить их куда-то,или вызвать интерпретацию функции отдельно,но тогда при рекурсии будет рекурсия в самом интерпретаторе. Не мог бы ты немного прояснить этот момент? Так ли это плохо,рекурсия в интерпретирующей программе,и если да,то как можно этого избежать? Я примерно представляю себе,что нужно строить ещё некое подобие "очереди выражений",или промежуточные вычисления для выражений,наподобие регистров,чтобы избежать рекурсии.
1
|
10.08.2010, 00:16 | 385 |
Если у тебя рекурсия в выражении, то рекурсия в интерпретаторе - это нормальное явление. Но при этом вложенность вызовов в интерпретаторе условно должна быть такой же, как и в исходнике. Операция вызова всегда обладает стековой структурой, потому что как минимум должна сохраняться точка возврата. В твоём случае ещё и должен сохраняться контекст (значение локальных переменных в точке вызова). И эти стеки будут расти параллельно со стеком исполнения (т.е. с процессом рекурсии внутри интерпретатора)
2
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
24.10.2010, 23:19 [ТС] | 386 | |||||
Заработал некий кастрированный вариант SUB с рекурсией, начиная с версии 0.84 .До переполнения стека я не дождался,как-нибудь попробую,к тому же,там через метки перехода сделано,а все данные в динамической памяти,так что,наверное,долго ждать нужно. Для теста можно использовать исходник ниже (или запустить главный исходник из каталога tests - /tests/sources/source.bas):
QBASIC source
Конечно,данный вариант рекурсии имеет мало смысла, но по крайней мере,механизм рекурсии сам по себе вроде работает. Если кто найдёт баги,ломающие интерпретатор (с помощью QBASIC-исходника имеется ввиду) - пишите. Осталось добавить работу с параметрами,и FUNCTION,возвращающую значение. Теперь потихоньку разгебу бардак с памятью (мне опять нетерпелось сделать поскорее,чтобы увидеть результат рекурсии). Фуккции,конечно,внесли много запутанности в логику работы,в логику кода вообще,так как изначально было не понятно,как всё это реализовывать.
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|
25.10.2010, 00:00 [ТС] | 388 |
Как я понял,все переменные в QBASIC - локальные внутри области видимости функции. Глобальная область видимости (имеется само тело прорграммы,не функции) перекрывается функциями. Если нужен доступ к переменной по всей программе,включая внутри функций,при объявлении этой переменной добавляется слово SHARED. Работает (вроде) только вкупе с DIM
Не по теме: http://en.wikibooks.org/wiki/QBasic/Full_Book_View#Declaring_a_subroutine Блин,я что не так понял,что-ли? Сейчас перечитываю,там вроде как написано,что в теле функции надо их объявлять,эти shared-переменные... Не помню,где такое ранее прочитать мог,но вроде проверял на настоящем бэйсике,вроде как сделал-правильно А-a,вот где я прочитал про SHARED! Не по теме: http://www.qbasicstation.com/index.php?c=t_adv&t=13
0
|
25.10.2010, 00:18 | 389 |
Ты всё-таки напиши, как это реализовано у тебя. Те, кто разбирается в бэйсике, в случае чего укажут на неправильные места. Те, кто в бэйсике не специалист, хотя бы поймут как интерпретатор тестировать (т.е. чего ожидать от программы)
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
25.10.2010, 00:24 [ТС] | 390 | |||||
В-общем,есть главный контейнер с данными(свой для массивов и свой для переменных),эти переменные видимы по всей программе,за исключением случаев вызова функций,когда интерпретируется тело функции. В этом случае,если в теле функции встречается переменная с тем же именем,что и в главном листе,конфликта деклараций не происходит,а просто создаётся переменная в собственном контейнере для этой функции.
Если же какую-либо переменную объявить через
Кстати,у меня есть баг с поиском переменных по листам/контейнерам,а я и забыл... там какие-то взаимоисключающие логические условия(алгоритм довольно неудачный),это надо копаться будет ещё
0
|
25.10.2010, 15:28 | 391 | |||||
Это что, в бэйсике так придумано? С виду выглядит через ж...у, но логика вроде бы такая, что переменная с модификатором SHARED - это в чистом виде глобал, а без модификатора - локал. При этом возникает понятие локальной переменной для всего модуля, но вроже бы как ничему не противоречит. Кроме, возможно, случая, когда исходник состоит из нескольких файлов, но я не уверен, что такое хозяйство у кого-то работает на интерпретаторах, скорее всего такое только в компиляторах
Добавлено через 9 минут На всякий случай лог сборки компилятором g++-4.1.2 - много warning'ов. У меня qt или нет или кривая версия, а потому оно не собралось. Систему configure надо бы научить это дело понимать, выдавать предупреждение, что у вас не будет GUI и не запускать его сборку Сборка компилятором g++-4.1.2
$ make
g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/debug/error_handler.cpp -o Interpreter/debug/error_handler.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/main.cpp -o Interpreter/main.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/lib/lib.cpp -o Interpreter/lib/lib.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/cmd/options.cpp -o Interpreter/cmd/options.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/memory/memory.cpp -o Interpreter/memory/memory.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/frontend/parser.cpp -o Interpreter/frontend/parser.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/frontend/syntax.cpp -o Interpreter/frontend/syntax.o Interpreter/frontend/syntax.cpp: In function 'expr_Node_t* syntax_Procedure(var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:481: warning: 'params' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'expr_Node_t* syntax_Primary(var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:346: warning: 'zero' is used uninitialized in this function Interpreter/frontend/syntax.cpp:359: warning: 'ind' is used uninitialized in this function Interpreter/frontend/syntax.cpp:373: warning: 'ind' is used uninitialized in this function Interpreter/frontend/syntax.cpp:145: warning: 'expr' may be used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtDIM(var_Arr_t*, arr_Arr_t*)': Interpreter/frontend/syntax.cpp:1183: warning: 'arr_elem_type' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1128: warning: 'start_indexes' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1127: warning: 'indexes' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1074: warning: 'var_type' may be used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtCLEAR(stmt_List_t*)': Interpreter/frontend/syntax.cpp:1514: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1515: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtBEEP(stmt_List_t*)': Interpreter/frontend/syntax.cpp:1507: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1508: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtEND(stmt_List_t*)': Interpreter/frontend/syntax.cpp:1501: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1502: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtCLS(stmt_List_t*)': Interpreter/frontend/syntax.cpp:1494: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1495: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtCIRCLE(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1469: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1488: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtLINE(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1411: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1463: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtPRESET(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1389: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1405: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtSCREEN(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1374: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1383: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtCALL(stmt_List_t*)': Interpreter/frontend/syntax.cpp:1354: warning: 'name' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1359: warning: 'parameters' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1360: warning: 'function_call' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1363: warning: 'return_from_call' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_Label(stmt_List_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1032: warning: 'addr' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1038: warning: 'label' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtGOTO(stmt_List_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:1009: warning: 'label' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1016: warning: 'label' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtINPUT(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:649: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:650: warning: 'var_list' is used uninitialized in this function Interpreter/frontend/syntax.cpp:417: warning: 'zero' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:446: warning: 'ind' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:432: warning: 'ind' may be used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_stmtPRINT(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:599: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:602: warning: 'print_expr_list' is used uninitialized in this function Interpreter/frontend/syntax.cpp:607: warning: 'print_expr_list' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'stmt_Node_t* syntax_stmtLET(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:515: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:539: warning: 'indexes' is used uninitialized in this function Interpreter/frontend/syntax.cpp:562: warning: 'indexes' is used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'stmt_Node_t* syntax_stmtFOR(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:818: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:856: warning: 'cbr_stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:857: warning: 'loop' is used uninitialized in this function Interpreter/frontend/syntax.cpp:973: warning: 'increment' is used uninitialized in this function Interpreter/frontend/syntax.cpp:975: warning: 'check' is used uninitialized in this function Interpreter/frontend/syntax.cpp:977: warning: 'lbl_on_true' is used uninitialized in this function Interpreter/frontend/syntax.cpp:979: warning: 'lbl_on_false' is used uninitialized in this function Interpreter/frontend/syntax.cpp:855: warning: 'rel_expr' may be used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'stmt_Node_t* syntax_CBranch(stmt_List_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/frontend/syntax.cpp:727: warning: 'label_finish' is used uninitialized in this function Interpreter/frontend/syntax.cpp:751: warning: 'lbl_on_false' is used uninitialized in this function Interpreter/frontend/syntax.cpp:776: warning: 'label_finish' is used uninitialized in this function Interpreter/frontend/syntax.cpp:793: warning: 'lbl_on_false' is used uninitialized in this function Interpreter/frontend/syntax.cpp:802: warning: 'cbr_stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:803: warning: 'loop' is used uninitialized in this function Interpreter/frontend/syntax.cpp:805: warning: 'check' is used uninitialized in this function Interpreter/frontend/syntax.cpp:807: warning: 'lbl_on_true' is used uninitialized in this function Interpreter/frontend/syntax.cpp:809: warning: 'lbl_on_false' is used uninitialized in this function Interpreter/frontend/syntax.cpp:987: warning: 'loop' is used uninitialized in this function Interpreter/frontend/syntax.cpp:991: warning: 'cbr_stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:992: warning: 'lbl_on_true' is used uninitialized in this function Interpreter/frontend/syntax.cpp:994: warning: 'lbl_on_false' is used uninitialized in this function Interpreter/frontend/syntax.cpp:786: warning: 'label_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:784: warning: 'lbl_on_false' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:783: warning: 'lbl_to_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:770: warning: 'label_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:764: warning: 'lbl_on_false' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:763: warning: 'lbl_to_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:758: warning: 'lbl_on_true' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:739: warning: 'label_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:737: warning: 'lbl_on_false' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:735: warning: 'lbl_to_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:710: warning: 'label_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:703: warning: 'lbl_on_false' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:702: warning: 'lbl_to_finish' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:697: warning: 'lbl_on_true' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:693: warning: 'cbr_stmt' may be used uninitialized in this function Interpreter/frontend/syntax.cpp: In function 'void syntax_Check()': Interpreter/frontend/syntax.cpp:1788: warning: 'stmt' is used uninitialized in this function Interpreter/frontend/syntax.cpp:1314: warning: 'exit_from_call' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1307: warning: 'function_call' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1306: warning: 'parameters' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1338: warning: 'body_end' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1335: warning: 'exit_from' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1280: warning: 'addr' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1268: warning: 'lcl_lbls' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1267: warning: 'lcl_arrs' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1266: warning: 'lcl_vars' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1263: warning: 'arrs_val_stack' may be used uninitialized in this function Interpreter/frontend/syntax.cpp:1255: warning: 'name' may be used uninitialized in this function g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/value.cpp -o Interpreter/intermediate/value.o Interpreter/intermediate/value.cpp: In member function 'Value Value::operator/(const Value&)': Interpreter/intermediate/value.cpp:485: warning: passing 'double' for argument 1 to 'void Value::Set_ival(_int_t)' g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/variable.cpp -o Interpreter/intermediate/variable.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/expression.cpp -o Interpreter/intermediate/expression.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/statement.cpp -o Interpreter/intermediate/statement.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/array.cpp -o Interpreter/intermediate/array.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/intermediate/label.cpp -o Interpreter/intermediate/label.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/runtime/interp.cpp -o Interpreter/runtime/interp.o Interpreter/runtime/interp.cpp: In function 'Value interp_CalcExpr(const expr_Node_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/runtime/interp.cpp:383: warning: 'parameters' is used uninitialized in this function Interpreter/runtime/interp.cpp: In function 'stmt_Node_t* interp_stmtLET(stmt_Node_t*, var_Arr_t*, arr_Arr_t*, lab_Arr_t*)': Interpreter/runtime/interp.cpp:466: warning: 'value' is used uninitialized in this function Interpreter/runtime/interp.cpp:480: warning: 'value' is used uninitialized in this function Interpreter/runtime/interp.cpp: In function 'void interp_Run()': Interpreter/runtime/interp.cpp:404: warning: 'parameters' may be used uninitialized in this function g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/runtime/function.cpp -o Interpreter/runtime/function.o Interpreter/runtime/function.cpp: In function 'Value func_Calculate(const expr_Node_t*, val_Arr_t*)': Interpreter/runtime/function.cpp:286: warning: 't' may be used uninitialized in this function Interpreter/runtime/function.cpp:304: warning: 't' may be used uninitialized in this function Interpreter/runtime/function.cpp:323: warning: 't2' may be used uninitialized in this function Interpreter/runtime/function.cpp:323: warning: 't1' may be used uninitialized in this function g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/runtime/graphics/graphics.cpp -o Interpreter/runtime/graphics/graphics.o Interpreter/runtime/graphics/graphics.cpp: In function 'void graphics_PRESET(val_Arr_t*)': Interpreter/runtime/graphics/graphics.cpp:215: warning: 'color' may be used uninitialized in this function g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/runtime/tracer/tracer.cpp -o Interpreter/runtime/tracer/tracer.o g++ -c -MD -ansi -pedantic -pedantic-errors -Wall -O2 -Os -I. -IInterpreter/runtime -IInterpreter/runtime/graphics -IInterpreter/runtime/tracer -IInterpreter/cmd -IInterpreter/config -IInterpreter/debug -IInterpreter/frontend -IInterpreter/intermediate -IInterpreter/lib -IInterpreter/include -IInterpreter/memory -IInterpreter Interpreter/runtime/pool.cpp -o Interpreter/runtime/pool.o Interpreter/runtime/pool.cpp:293:1: warning: "/*" within comment Interpreter/runtime/pool.cpp: In member function '_bool_t Pool::isConflictingDeclaration(std::string, unsigned int)': Interpreter/runtime/pool.cpp:208: warning: 'and' of mutually exclusive equal-tests is always 0 Interpreter/runtime/pool.cpp:221: warning: 'and' of mutually exclusive equal-tests is always 0 Interpreter/runtime/pool.cpp:234: warning: 'and' of mutually exclusive equal-tests is always 0 Interpreter/runtime/pool.cpp:247: warning: 'and' of mutually exclusive equal-tests is always 0 g++ -lSDL Interpreter/debug/error_handler.o Interpreter/main.o Interpreter/lib/lib.o Interpreter/cmd/options.o Interpreter/memory/memory.o Interpreter/frontend/parser.o Interpreter/frontend/syntax.o Interpreter/intermediate/value.o Interpreter/intermediate/variable.o Interpreter/intermediate/expression.o Interpreter/intermediate/statement.o Interpreter/intermediate/array.o Interpreter/intermediate/label.o Interpreter/runtime/interp.o Interpreter/runtime/function.o Interpreter/runtime/graphics/graphics.o Interpreter/runtime/tracer/tracer.o Interpreter/runtime/pool.o -o basin \ && /bin/mv ./basin ./bin/basin cd ./GUI/Qt/Basin-IDE && /usr/bin/qmake -project \ && /usr/bin/qmake && /usr/bin/make && cd .. && cd .. && cd .. \ && /bin/mv ./GUI/Qt/Basin-IDE/Basin-IDE ./bin/Basin-IDE Сборка GUI
g++ -c -pipe -O2 -march=pentium3 -mtune=pentium4 -pipe -fno-strict-aliasing -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o editor.o editor.cpp
In file included from editor.cpp:22: editor.h:22:26: error: QPlainTextEdit: No such file or directory editor.h:36: error: expected class-name before '{' token editor.h:36: warning: 'class CodeEditor' has virtual functions but non-virtual destructor editor.h: In constructor 'LineNumberArea::LineNumberArea(CodeEditor*)': editor.h:64: error: no matching function for call to 'QWidget::QWidget(CodeEditor*&)' /usr/include/qt4/QtGui/qwidget.h:728: note: candidates are: QWidget::QWidget(const QWidget&) /usr/include/qt4/QtGui/qwidget.h:669: note: QWidget::QWidget(QWidgetPrivate&, QWidget*, Qt::WindowFlags) /usr/include/qt4/QtGui/qwidget.h:219: note: QWidget::QWidget(QWidget*, Qt::WindowFlags) editor.cpp: In constructor 'CodeEditor::CodeEditor(QWidget*)': editor.cpp:24: error: class 'CodeEditor' does not have any field named 'QPlainTextEdit' editor.cpp:29: error: 'connect' was not declared in this scope editor.cpp:43: error: 'setFont' was not declared in this scope editor.cpp:44: error: 'setLineWidth' was not declared in this scope editor.cpp:46: error: 'document' was not declared in this scope editor.cpp: In member function '_int_t CodeEditor::lineNumberAreaWidth()': editor.cpp:52: error: 'blockCount' was not declared in this scope editor.cpp:58: error: 'fontMetrics' was not declared in this scope editor.cpp: In member function 'void CodeEditor::updateLineNumberAreaWidth(_int_t)': editor.cpp:65: error: 'setViewportMargins' was not declared in this scope editor.cpp: In member function 'void CodeEditor::updateLineNumberArea(const QRect&, _int_t)': editor.cpp:76: error: 'viewport' was not declared in this scope editor.cpp: In member function 'void CodeEditor::resizeEvent(QResizeEvent*)': editor.cpp:82: error: 'QPlainTextEdit' has not been declared editor.cpp:84: error: 'contentsRect' was not declared in this scope editor.cpp: In member function 'void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent*)': editor.cpp:94: error: 'firstVisibleBlock' was not declared in this scope editor.cpp:95: error: 'class QTextBlock' has no member named 'blockNumber' editor.cpp:97: error: 'blockBoundingGeometry' was not declared in this scope editor.cpp:97: error: 'contentOffset' was not declared in this scope editor.cpp:99: error: 'blockBoundingRect' was not declared in this scope editor.cpp:103: error: 'class QTextBlock' has no member named 'isVisible' editor.cpp:108: error: 'fontMetrics' was not declared in this scope editor.cpp: In member function 'void CodeEditor::highlightCurrentLine()': editor.cpp:125: error: 'textCursor' was not declared in this scope editor.cpp:129: error: 'setExtraSelections' was not declared in this scope editor.cpp: In member function 'void CodeEditor::highlightCurrentErrorLine(const QString&)': editor.cpp:140: error: 'textCursor' was not declared in this scope editor.cpp:160: error: 'setTextCursor' was not declared in this scope editor.cpp:161: error: 'setExtraSelections' was not declared in this scope editor.cpp:162: error: 'ensureCursorVisible' was not declared in this scope make[1]: *** [editor.o] Error 1 Добавлено через 26 минут Написал пример:
Код
file: a.bas line: 9 error: Undefined function: FUNC2 Код
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check Aborted Код
basin: Interpreter/intermediate/value.cpp:193: Value Value::operator+(const Value&): Assertion `0' failed. Aborted В общем, так и не получилось что-то вменяемое протестировать. Скачивал tar.gz по ссылке из первого поста. Неплохо было бы, чтобы интерпретатор умел печатать свою версию (которая, например, совпадала бы с номером ревизии). Как сделать так, чтобы svn автоматически писал нормер ревизии в файл - навскидку не помню, но вечером могу из дома ссылку прислать Добавлено через 1 минуту Странно, но форум заменил "loc" на "LOC" - видимо какое-то ключевое слово. Но суть от этого не меняется (вместо "loc" можно написать "venik")
2
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
|||||||||||
25.10.2010, 22:34 [ТС] | 392 | ||||||||||
Действительно,о таком случае последовательного вызова я как-то даже и не подумал . Надо глянуть.
Видимо,там дело в том,что при построении дерева функции func1 func2 ещё не известна,нужно делать похожую вещь,как с метками,проверяя соответствие вызовов с определениями. Странно,но у меня почему-то после удаления func2 выдаёт-таки ошибку: file:source_err.bas line:5 error: Undefined symbol: LOC на код: код
Добавлено позже: Я походу,так увлёкся функциями,что или сломал что-то,или до этого так и было : у меня ошибку на LOC выдавало потому,что интерпретатор запущен с опцией --noinit-errors,а по идее там должна быть инициализация нулём в выражении... и она даже есть,просто механизм функций всё поменял. Буду исправлять. Про сборку: Я пытался сделать,чтобы при отсутствии Qt собиралась только косольная программа,в итоге я так и не смог этого добиться,судя по твоим логам. Всё это я пытался проделать в Makefile. Насчёт предупреждений,я как раз думал,как лучше сделать.До сих пор с сомнениях. Дело в том,что в программе неудачно реализован "менеджмент" памяти.Есть шаблонная функция memalloc() которая принимает неинициализированный указатель,а возвращает инициализированный+подсчитывает количество выделенной памяти.Это,в свою очередь,вызывает кучу предупреждений о том что в функцию посылается неинициализированный указатель. Очень мозолит глаза Вот теперь не знаю,как же быть,прокручиваю все варианты(autoptr и другое пока использовать неохота).Думал сделать специальный интерфейс выделения памяти,но тоже получается не очень красиво:
0
|
26.10.2010, 00:06 | 393 |
По поводу неинициализированной переменной - у меня выдало то, что я показывал. Я интерпретатор ручками запускал, может ты из-под IDE, а потому у тебя опция принудительно подаётся
Про сборку - это я так, заметил и написал, чтобы не потерялось. Понятно, что на данном этапе сие совсем не горит Про менеджер памяти - ничего не понял. Зачем подавать туда неинициализированный указатель
1
|
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
|
||||||
26.10.2010, 00:32 [ТС] | 394 | |||||
Я уже примерно понял,в чём там ошибка. Связано с ранним выделением памяти под Value для переменной (в случае,если она участвует в выражении,но встречается впервые),ещё на этапе построения дерева,что не правильно. И далее идёт бардак с типизацией,потому что в функциях у меня все значения выделяются блоком и типизация немного недоработана.
А что,инициализировать его NULL сначала? Функция memalloc выглядит примерно так memalloc
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
26.10.2010, 17:19 | 396 | |||||
Evg, Аллокатор есть. Но насколько я знаю он выглядит не совсем так. Разрабатывал свой простенький для вектора.
Аллокатор
1
|
26.10.2010, 17:35 | 397 | ||||||||||
можно записать так:
Добавлено через 37 секунд все когда-то писали аллокатор, как и строку
2
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.10.2010, 17:45 | 399 |
Evg, Ну да. Менеджер памяти.
1
|
26.10.2010, 17:54 | 400 |
ну нет..
аллокатор берет на себя ответственность по конструированию/инициализации типов, и деаллокацию. ничего более. это же не memory pool. Добавлено через 1 минуту это тоже не всегда справедливо. зависит от типа.
2
|
26.10.2010, 17:54 | |
26.10.2010, 17:54 | |
Помогаю со студенческими работами здесь
400
Пишем свой класс, спецификатор доступа protected Интерпретатор небольшого языка программирования на С++ Не удается откомпилировать интерпретатор М-языка Интерпретатор музыки стандарта BASIC PLAY на С++ Написать интерпретатор программного языка -помощь Интерпретатор/компилятор ассемблер-подобного языка Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |