С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
perimetral
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
#1

Brainf**k - C++

07.02.2011, 12:48. Просмотров 1400. Ответов 23
Метки нет (Все метки)

Народ, суть проблемы такова: наш препод по программированию сам только только окончил вуз, и, к сожалению, это дотавляет неприятности. Вот какое задание к лабораторной он дал:
"Как известно, язык Brainf**k есть интерпретируемый язык программирования с 8ю операциями: > < + - [ ] , .. Задача состоит в написании интерпретатора для него на C++.". Почитать о нем лучше всего на Вики. Это вроде не сложно. В крайнем случае можно взять известный интерпретатор на JS и переписать структуру под C++. Но для 5ки, нужно еще кое-что добавить: необходимо описать процедуры языка. Для управления процедурами добавить еще 3 оператора: ( ) :. Оператор ( должен начинать описание процедуры. Т.е. грубо говоря, функции. ID (как бы имя) процедуры есть число и сохраняется в ячейке, на которой стоит каретка при описании процедуры. Оператор ) заканчивает процедуру. Код в процедуре не выполняется при последовательном интерпретировании кода, и вызывается командой :. Команда : читает значение текущей ячейки и вызывает процедуру с ID, указанным в этой ячейке. Для работы в процедуру передается следующая ячейка (т.е. в самой процедуре каретка изначально будет стоять на ячейке n+1, где n - ячейка , хранящая ID процедуры).
Народ, пожалуйста, помогите, для повышенной стипендии как раз не хватает этого зачета на 5, буду очень благодарен! Сдавать в пятницу, так что, думаю, время есть. Собственно, нужен полный интерпретатор + новые 3 команды.
Пример кода с ними:
Код
>>>+(+++)<<<,>+:<[>>+<<-].
Тут мы в 3й ячейке (если отчет с 0 вести) ставим ID процедуры = 1, потом описываем процедуру (она трижды инкрементирует рабочую ячейку), потом возвращаемся в ячейку 0, вводим в нее символ, в ячейке 1 ставим единицу и вызываем процедуру с этим ID. Т.к. рабочая ячейка нашей процедуры в данном случае - ячейка 2, потому мы возвращаемся в ячейку 0 и переносим из нее значение в ячейку 2, прибавляя то, что там уже есть. Выводим результат - наш символ + 3 по ASCII.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
07.02.2011, 15:20 #2
Может, в раздел фриланса перенести? Сомневаюсь, что у кого-то хватит энтузиазма делать за тебя курсовую (или что это такое) ради твоей же повышенной стипендии.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
07.02.2011, 15:29 #3
Так, а в чём же, собственно, заключаются те неприятности, которые вам доставляет факт недавнего окончания вуза вашим преподавателем?
0
easybudda
07.02.2011, 16:19
  #4

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Так, а в чём же, собственно, заключаются те неприятности, которые вам доставляет факт недавнего окончания вуза вашим преподавателем?
Взятки брать пока боится, приходится по чесноку всё делать...

5
silent_1991
07.02.2011, 16:22
  #5

Не по теме:

easybudda,

0
perimetral
1 / 1 / 0
Регистрация: 17.12.2010
Сообщений: 16
07.02.2011, 16:32  [ТС] #6
Как никак, а easybudda прав. Да и прошу скорей не весь интерпретатор, а хотя бы лирическую теорию о том, как можно реализовать процедуры.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
07.02.2011, 16:37 #7
Да что реализовывать-то? Создаёте список, элементы узла - ID процедуры и строка, содержащая код процедуры. При вызове процедуры ищете в списке процедуру с таким ID и выполняете для следующей ячейки все действия, описанные в процедуре.
1
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
07.02.2011, 18:53 #8
Цитата Сообщение от perimetral Посмотреть сообщение
Для управления процедурами добавить еще 3 оператора: ( ) :. Оператор ( должен начинать описание процедуры. Т.е. грубо говоря, функции. ID (как бы имя) процедуры есть число и сохраняется в ячейке, на которой стоит каретка при описании процедуры. Оператор ) заканчивает процедуру. Код в процедуре не выполняется при последовательном интерпретировании кода, и вызывается командой :. Команда : читает значение текущей ячейки и вызывает процедуру с ID, указанным в этой ячейке.
Кстати, было бы интересней, если бы у каждой функции (процедуры) было бы свое окружение. Это бы, к примеру, позволяло бы создавать локальные функции
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.02.2011, 18:54 #9
Nameless One, Ну по-моему область видимости реализовать не столь просто... Или я ошибаюсь?
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
07.02.2011, 19:02 #10
ForEveR, попробую что-нибудь сделать по этому поводу. Мыслишки есть, если получится, завтра выложу.

Добавлено через 6 минут
Если вкратце - есть структура типа "окружение", которая помимо другой информации хранит массив указателей на структуру "окружение". Этот массив и будет представлять локальные (по отношению к текущему окружению) функции. Так как переменных, по сути, нет (их представляют ячейки), то реализовать такое будет довольно несложно. Функции не будут предоставлять возможности доступа к ячейкам из внешнего окружения.
1
iama
1251 / 976 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
07.02.2011, 19:06 #11
http://www.mathematik.uni-marburg.de/~schmidtm/bfi.c

Не по теме:

кошмар, сколько народу гуглить не умеет

0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
07.02.2011, 19:19 #12
А не легче ли рекурсией это реализовать? Это будет и естественнее, и проще. Или я чего-то не понял?

Добавлено через 1 минуту
iama, и что? Реализовать исходный интерпретатор не представляет никакой сложности. Здесь интереснее обработку процедур реализовать (дополнение к традиционному брэйнфаку). Так что вы уж повнимательнее тему читайте, прежде чем "народ" обвинять.
0
iama
1251 / 976 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
07.02.2011, 19:20 #13
вай. пардон.
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
07.02.2011, 19:21 #14
silent_1991, рекурсия там тоже будет
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
07.02.2011, 19:53 #15
Nameless One, а зачем вообще заморачиваться со структурами? При первом проходе просто разделяем код на функции, и разбиваем их по списку, как я уже ранее предлагал. Далее, при вызове, рекурсивно запускаем парсер для строки, хранящейся в нужном узле списка. Поскольку вызывается новых экземпляр парсера, то и память будет выделена новая, и вообще естественным образом будет организована локальная область.
2
07.02.2011, 19:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.