Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2011, 13:56   #1
Alex_under
 
Регистрация: 11.10.2009
Сообщений: 8
По умолчанию Интерпретатор Brainfuck

Всем доброго времени суток.
Пишу курсовую по данной теме и столкнулся с проблемой реализации операторов "[" и "]" языка brainfuck. Вроде понятно, как они работают, но при попытке реализации на C++ сталкиваюсь с проблемой не корректной работы.
Прошу помощи)
Alex_under вне форума Ответить с цитированием
Старый 01.05.2011, 14:36   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Используем стек.
Примерно по такому алгоритму можно сделать:
1) Если следующий символ открывающаяся скобка, то помещаем ее позицию в стек.
2) Если следующий символ закрывающаяся скобка, то проверяем текущую ячейку на ноль. Если она равна нулю, то выбрасываем значение из стека и переходим на следующий символ, иначе ставим указатель на позицию скобки из вершины стека.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 01.05.2011, 15:15   #3
Alex_under
 
Регистрация: 11.10.2009
Сообщений: 8
По умолчанию

а без стеков реализовать можно?
просто со стеками не сильно дружу.
Alex_under вне форума Ответить с цитированием
Старый 01.05.2011, 15:17   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

А пора бы подружиться. Очень полезная и нужна вещь.
Почитать можно здесь.
Нужны лишь методы top, push и pop.
Здесь суть работы стека.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 01.05.2011, 15:18   #5
Alex_under
 
Регистрация: 11.10.2009
Сообщений: 8
По умолчанию

спасибо большое) буду грызть)
Alex_under вне форума Ответить с цитированием
Старый 01.05.2011, 15:43   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Набросал:
Код:
#include <map>
#include <stack>
#include <string>
#include <iostream>

int main()
{
    //Программа на BF
    std::string input;
    //Стек
    std::stack<int> stack;
    //Ячейки
    std::map<int, char> cells;
    //Указатель на текущую ячейку
    int pointer = 0;
    //Читаем программу
    std::cin>>input;
    for (unsigned int i = 0; i < input.length(); i++)
    {
        switch (input[i])
        {
            case '+':
                cells[pointer]++;
                break;
            case '-':
                cells[pointer]--;
                break;
            case '>':
                pointer++;
                break;
            case '<':
                pointer--;
                break;
            case '[':
                stack.push(i);
                break;
            case ']':
                if (cells[pointer] != 0)
                {
                    //Проверка на ошибки
                    if (stack.empty())
                    {
                        std::cout<<"Ошибка: различное количество скобок"<<std::endl;
                        break;
                    }
                    i = stack.top();
                }
                else
                    stack.pop();
                break;
            case '.':
                std::cout<<cells[pointer];
                break;
            case ',':
                std::cin>>cells[pointer];
                break;
        }
    }
    return 0;
}
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 01.05.2011 в 15:47.
russian-stalker вне форума Ответить с цитированием
Старый 01.05.2011, 17:28   #7
Alex_under
 
Регистрация: 11.10.2009
Сообщений: 8
По умолчанию

ну со стеком вроде более менее (по крайней мере для моего случая) ясно.
вопрос ещё такой, я пишу на winapi и не могу нормально вывести интерпретированный результат.

case '.':
SetWindowText (hEditC, ????);
break;

у меня pointer объявлен, как char *pointer, я не использовал std::map.
поэтому вторым аргументом я писал pointer, но при этом после результата в hEditC дописывался оставшийся код из первого Edit'a.

подскажите пожалуйста.

обработка нажатия кнопки "интерпретировать"
Код:
case BUTTON2:
		std::stack <int> stack;
					
		CodeLength = GetWindowTextLength (hEditBf) + 1;
		char *BFCode = new char [CodeLength];
		memset (BFCode, 0, CodeLength);
		GetWindowText (hEditBf, BFCode, CodeLength);
		char *pointer;
		pointer = &BFCode[0];//помещаю pointer в 0 ячейку
		for (int i = 0; i < CodeLength; i++)
		{
			switch (BFCode [i])
			{
                         case '+':
                                (*pointer) ++;
                                break;
                         case '-':
                                (*pointer) --;
                                break;
                         case '>':
                                pointer ++;
                                break;
                         case '<':
                               pointer --;
                               break;
                        case '[':
                              stack.push(i);
                              break;
                        case ']':
                              if ((*pointer) != 0)
                              {
                                  if (stack.empty())
                                 {
                                    MessageBox (hWnd, "Ошибка: различное количество скобок", "Ошибка", NULL);
                                    break;
                                  }
                                 i = stack.top();
                          }
                else
                    stack.pop();
                break;
            case '.':
				SetWindowText (hEditC, pointer);
                break;
            case ',':
                //GetWindowText (hEditBf, pointer, CodeLength);
                break;
        }

Последний раз редактировалось Alex_under; 01.05.2011 в 17:32.
Alex_under вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BrainFuck anGeee Помощь студентам 1 04.08.2016 13:37
Процедурный Brainfuck tunyash Софт 0 17.06.2010 08:55
Интерпретатор Volkodav2411 Фриланс 6 04.02.2010 21:17
Интерпретатор Паскаля SvetickPro Помощь студентам 1 17.10.2008 22:00
командный интерпретатор <Dusha> Общие вопросы C/C++ 4 16.08.2008 18:27