1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
|
|
1 | |
Brainf**k07.02.2011, 12:48. Показов 2211. Ответов 23
Метки нет (Все метки)
Народ, суть проблемы такова: наш препод по программированию сам только только окончил вуз, и, к сожалению, это дотавляет неприятности. Вот какое задание к лабораторной он дал:
"Как известно, язык Brainf**k есть интерпретируемый язык программирования с 8ю операциями: > < + - [ ] , .. Задача состоит в написании интерпретатора для него на C++.". Почитать о нем лучше всего на Вики. Это вроде не сложно. В крайнем случае можно взять известный интерпретатор на JS и переписать структуру под C++. Но для 5ки, нужно еще кое-что добавить: необходимо описать процедуры языка. Для управления процедурами добавить еще 3 оператора: ( ) :. Оператор ( должен начинать описание процедуры. Т.е. грубо говоря, функции. ID (как бы имя) процедуры есть число и сохраняется в ячейке, на которой стоит каретка при описании процедуры. Оператор ) заканчивает процедуру. Код в процедуре не выполняется при последовательном интерпретировании кода, и вызывается командой :. Команда : читает значение текущей ячейки и вызывает процедуру с ID, указанным в этой ячейке. Для работы в процедуру передается следующая ячейка (т.е. в самой процедуре каретка изначально будет стоять на ячейке n+1, где n - ячейка , хранящая ID процедуры). Народ, пожалуйста, помогите, для повышенной стипендии как раз не хватает этого зачета на 5, буду очень благодарен! Сдавать в пятницу, так что, думаю, время есть. Собственно, нужен полный интерпретатор + новые 3 команды. Пример кода с ними: Код
>>>+(+++)<<<,>+:<[>>+<<-].
0
|
07.02.2011, 12:48 | |
Ответы с готовыми решениями:
23
Интерпретатор Brainf**k из .pl под Visual Prolog 5.2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
07.02.2011, 15:20 | 2 |
Может, в раздел фриланса перенести? Сомневаюсь, что у кого-то хватит энтузиазма делать за тебя курсовую (или что это такое) ради твоей же повышенной стипендии.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.02.2011, 15:29 | 3 |
Так, а в чём же, собственно, заключаются те неприятности, которые вам доставляет факт недавнего окончания вуза вашим преподавателем?
0
|
easybudda
|
07.02.2011, 16:19
#4
|
5
|
silent_1991
|
07.02.2011, 16:22
#5
|
Не по теме: easybudda, :D:good:
0
|
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
|
|
07.02.2011, 16:32 [ТС] | 6 |
Как никак, а easybudda прав. Да и прошу скорей не весь интерпретатор, а хотя бы лирическую теорию о том, как можно реализовать процедуры.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.02.2011, 16:37 | 7 |
Да что реализовывать-то? Создаёте список, элементы узла - ID процедуры и строка, содержащая код процедуры. При вызове процедуры ищете в списке процедуру с таким ID и выполняете для следующей ячейки все действия, описанные в процедуре.
1
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
07.02.2011, 18:53 | 8 |
Кстати, было бы интересней, если бы у каждой функции (процедуры) было бы свое окружение. Это бы, к примеру, позволяло бы создавать локальные функции
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
07.02.2011, 18:54 | 9 |
Nameless One, Ну по-моему область видимости реализовать не столь просто... Или я ошибаюсь?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
07.02.2011, 19:02 | 10 |
ForEveR, попробую что-нибудь сделать по этому поводу. Мыслишки есть, если получится, завтра выложу.
Добавлено через 6 минут Если вкратце - есть структура типа "окружение", которая помимо другой информации хранит массив указателей на структуру "окружение". Этот массив и будет представлять локальные (по отношению к текущему окружению) функции. Так как переменных, по сути, нет (их представляют ячейки), то реализовать такое будет довольно несложно. Функции не будут предоставлять возможности доступа к ячейкам из внешнего окружения.
1
|
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
07.02.2011, 19:06 | 11 |
http://www.mathematik.uni-marb... idtm/bfi.c
Не по теме: кошмар, сколько народу гуглить не умеет
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.02.2011, 19:19 | 12 |
А не легче ли рекурсией это реализовать? Это будет и естественнее, и проще. Или я чего-то не понял?
Добавлено через 1 минуту iama, и что? Реализовать исходный интерпретатор не представляет никакой сложности. Здесь интереснее обработку процедур реализовать (дополнение к традиционному брэйнфаку). Так что вы уж повнимательнее тему читайте, прежде чем "народ" обвинять.
0
|
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
07.02.2011, 19:20 | 13 |
вай. пардон.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
07.02.2011, 19:21 | 14 |
silent_1991, рекурсия там тоже будет
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.02.2011, 19:53 | 15 |
Nameless One, а зачем вообще заморачиваться со структурами? При первом проходе просто разделяем код на функции, и разбиваем их по списку, как я уже ранее предлагал. Далее, при вызове, рекурсивно запускаем парсер для строки, хранящейся в нужном узле списка. Поскольку вызывается новых экземпляр парсера, то и память будет выделена новая, и вообще естественным образом будет организована локальная область.
2
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
07.02.2011, 20:02 | 16 |
silent_1991, хм... Возможно, так будет лучше. В принципе, твое решение будет отличаться от моего только тем, что, у тебя ячейки (переменные) будут представлять собой локальные переменные функции-парсера, а не будут храниться явно в экземляре структуры; т.е. они будут уничтожаться автоматически при возврате из функции, и не придется их вручную "подчищать".
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
07.02.2011, 20:05 | 17 |
Nameless One, именно. Мне просто это решение естественным кажется. Вроде как побочного эффекта от решения другой задачи (т.е. мы решаем задачу собственно реализации функций в брэйнфаке, а побочным эффектом рекурсивного метода является ещё и реализация областей видимости в качестве бонуса).
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
08.02.2011, 21:37 | 18 | |||||
Сделал вариант интерпретатора, в котором новые операции определены немного не так, как хотел ТС (но переделать под свои нужды, ИМХО, несложно). Новые операторы вводят не процедуры в их типичном "паскалевском" понимании, а функции, а именно, функции без переменных, которые возвращают значение текущей на момент возврата ячейки. У каждой функции собственные локальные переменные (ячейки). Переменные из внешней области видимости захватывать нельзя. Можно создавать вложенные определения функций. Операторы '(' и ')', соответственно, определяют начало и конец локальной функции. Оператор ':' вызывает функцию, ID которой задается значением текущей ячейки, и записывает в эту же ячейку возвращаемое значение функции.
Ну и программа для теста, которая выводит зацензуренное название языка (прям как в названии темы): Код
(+++++++++++[>++++++<-]>)(+++++++++++[>++++++++++<-]>)(+++++++[>++++++<-]>):.>+:++++.>+:-------------.++++++++.>+:.<---.>>++:..<<+++++. Разбор программы
Помимо главной функции, программа содержит три локальных:
Не по теме: Кстати, Wikipedia почему-то считает LOLCODE диалектом сабжа
2
|
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
|
|
08.02.2011, 23:38 [ТС] | 19 |
Суть в том, что мне лично не нужно, дабы у каждой функции была своя область видимости. Ибо с общей областью видимости программист может передавать параметры (например, в следующих ячейках).
0
|
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
|
||||||||||||
08.02.2011, 23:47 [ТС] | 20 | |||||||||||
Недавно вот тут: https://www.cyberforum.ru/cpp-... read239337 я просил вас о помощи в реализации интерпретатора Brainf**ck с процедурами. Предложенный вариант не подошел тем, что присутствует ограничение области видимости процедуры. А тем временем я дописал свой интерпретатор, но возникла новая проблема - неизвестная ересь при работе с процедурами. Я сделал парсер отдельной функцией, которую и вызываю при старте программы; при встрече процедуры я вызываю парсер на текст внутри процедуры. Проблема в том, что текст в процедурах не парсится, не знаю, почему. Я бы и сам нашел ошибку, если бы мог ходить отладкой (F10) по коду, но не могу, ибо нужно вводить аргумент в cmd, чего при отладке по F10 нельзя. Кстати, VS2010. Вот код:
Код
0
|
08.02.2011, 23:47 | |