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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2016, 22:06   #1
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию Ошибка в компиляторе

Я сделал компилятор языка Brainfuck, вот его код:
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

static unsigned short st[4096],stp=4095;
void push (int value);
void pop (int* value);

int main(int argc, char **argv)
{

    vector<char> acc;
    string out="org 100h\n";
    char ch;
    ifstream infile(argv[1]);
    while(infile)
    {
        infile.get(ch);
        acc.push_back(ch);
    }
    infile.close();
    int j = 0;
    for(int i = 0; i < acc.size(); ++i)
    {
        if(acc[i] == '>') out+="inc bx\n";
        if(acc[i] == '<') out+="dec bx\n";
        if(acc[i] == '+') out+="inc byte [bx]\n";
        if(acc[i] == '-') out+="dec byte [bx]\n";
        if(acc[i] == '.') out+="mov al,[bx]\nmov ah,0Eh\nint 10h\n";
        if(acc[i] == ',') out+="mov ah,0Eh\nint 10h\nmov ah,0\nint 16h\nmov [bx],al\n";
        if(acc[i] == '[')
        {
			j++;
			push(j);
			out+="nptr"+to_string(j)+":\ncmp byte [bx],0\nje ptr"+to_string(j)+"\n";
		} 
        if(acc[i] == ']')
        {
			pop(&j);
			out+="jmp nptr"+to_string(j)+"\n ptr"+to_string(j)+":\n";
        }
    }
    out+="mov ah,0\nint 16h\nint 20h\n";
    ofstream outfile(argv[2]);
    outfile << out;
    outfile.close();
    return 0;
} 

void push (int value) 
{
	stp--;
	st[stp]=value;
}
void pop (int* value) 
{
	*value=st[stp];
	stp++;
}
Он транслирует программу на Brainfuck в Ассемблерный файл для FASM.
Но при компиляции программы возникает ошибка.
Цитата:
flat assembler version 1.71.21 (16384 kilobytes memory)
dbfi.asm [121]:
ptr11:
error: symbol already defined.
Пытался исправить, но ничего не получилось.
Транслировал вот эту программу:
Код:
>>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[
->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<<
]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[>
+<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>-
[<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[
>->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<]
Помогите исправить эту ошибку.

Последний раз редактировалось timcryt; 19.03.2016 в 14:40.
timcryt вне форума Ответить с цитированием
Старый 19.03.2016, 00:18   #2
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Реализуй генерацию меток как-нибудь по другому. У тебя ошибка появляется из-за того, что твой компилятор по несколько раз в коде объявляет метку с одним и тем же именем.

Декрементить инкрементируешься счетчик - плохой тон, ошибку фиг найдешь, но происходит, на вскидку, из-за того, что когда компилишь ]]] у тебя до этого кода уже j когда-то был равен 11, сейчас же j = 14, а после компиляции j = 11, из-за чего объявляешь вновь ptr11 и он пихает ошибку.

Попробуй переписать как-нибудь поумнее генерацию уникальных меток, не через j+=2 ... j--, ибо трэш.
Malriser вне форума Ответить с цитированием
Старый 19.03.2016, 08:06   #3
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию

А как по другому можно генерировать метки?
timcryt вне форума Ответить с цитированием
Старый 19.03.2016, 11:11   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Добавлять в метку уникальный счетчкик - label1, label2, label3 и т.д.
Самое главное, вам надо будет отслеживать вложения конструкций [] и "запоминать" комплект меток для данной группы []... с помощью стека сделать это довольно просто - встреча [ сохраняем контекст в стеке, дойдя до ] вытаскиваем.
waleri вне форума Ответить с цитированием
Старый 19.03.2016, 14:31   #5
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

А где ты взял Brainfuck?
Попробуй использовать другой набор символов. Например:
o_o O_O %| и т.д.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 19.03.2016, 14:40   #6
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию

Сделал код с сохранением в стек (изменил в первом сообщении), но все равно FASM сообщает о повторяющейся метке
timcryt вне форума Ответить с цитированием
Старый 19.03.2016, 14:50   #7
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию

Brainfuck я взял на википедии (случайная статья по нему была). А другой набор символов я сейчас попробовал, не помогает.
timcryt вне форума Ответить с цитированием
Старый 19.03.2016, 18:24   #8
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию

Переделал код вот так:
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

static unsigned short st[4096],stp=4095;
void push (int value);
void pop (int* value);

int main(int argc, char **argv)
{

    vector<char> acc;
    string out="\
    org 100h\n\
    mov bx,0FFFFh\n\
whl:\n\
	mov byte [bx],0\n\
	dec bx\n\
	cmp bx,8ACFh\n\
	jne whl\n\
	inc bx\n\
    ";
    char ch;
    ifstream infile(argv[1]);
    while(infile)
    {
        infile.get(ch);
        acc.push_back(ch);
    }
    infile.close();
    int j = 0,k=1;
    for(unsigned int i = 0; i < acc.size(); ++i)
    {
        if(acc[i] == '>') out+="inc bx\n";
        if(acc[i] == '<') out+="dec bx\n";
        if(acc[i] == '+') out+="inc byte [bx]\n";
        if(acc[i] == '-') out+="dec byte [bx]\n";
        if(acc[i] == '.') out+="mov al,[bx]\nmov ah,0Eh\nint 10h\n";
        if(acc[i] == ',') out+="mov ah,0Eh\nint 10h\nmov ah,0\nint 16h\nmov [bx],al\n";
        if(acc[i] == '[')
        {
			j++;
			push(j);
			out+="nptr"+to_string(j)+":\ncmp byte [bx],0\nje ptr"+to_string(k+1)+"\n";
		} 
        if(acc[i] == ']')
        {
			pop(&k);
			k++;
			out+="jmp nptr"+to_string(j)+"\n ptr"+to_string(k)+":\n";
        }
    }
    out+="mov ah,0\nint 16h\nint 20h\n";
    ofstream outfile(argv[2]);
    outfile << out;
    outfile.close();
    return 0;
} 

void push (int value) 
{
	stp--;
	st[stp]=value;
}
void pop (int* value) 
{
	*value=st[stp];
	stp++;
}
После трансляции FASM его проглатывает спокойно, без ошибок. Но код работает неправильно, пробовал на нескльких примерах: с этим
Код:
 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
 .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
 ------.--------.>+.>.
Работает нормально,
с этим
Код:
>++[>++[>++[>++[>++[>++<-]<-]<-]<-]<-]>>>>>.
>+++[>+++[>+++[>+++<-]<-]<-]>>>.
>+++++[>+++++[>+++++<-]<-]>>.
>++++++++++.
Выводит какую-то фигню (которой быть не должно), а этот
Код:
>>>+[[-]>>[-]++>+>+++++++[<++++>>++<-]++>>+>+>+++++[>++>++++++<<-]+>>>,<++[[>[
->>]<[>>]<<-]<[<]<+>>[>]>[<+>-[[<+>-]>]<[[[-]<]++<-[<+++++++++>[<->-]>>]>>]]<<
]<]<[[<]>[[>]>>[>>]+[<<]<[<]<+>>-]>[>]+[->>]<<<<[[<<]<[<]+<<[+>+<<-[>-->+<<-[>
+<[>>+<<-]]]>[<+>-]<]++>>-->[>]>>[>>]]<<[>>+<[[<]<]>[[<<]<[<]+[-<+>>-[<<+>++>-
[<->[<<+>>-]]]<[>+<-]>]>[>]>]>[>>]>>]<<[>>+>>+>>]<<[->>>>>>>>]<<[>.>>>>>>>]<<[
>->>>>>]<<[>,>>>]<<[>+>]<<[+<<]<]
Вообще не работает (нажимаю клавишу и он завершается).
Где здесь ошибка?
timcryt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки в компиляторе bol2909 C++ Builder 15 24.02.2015 14:39
Ассемблер на компиляторе TASM Кристюня Помощь студентам 0 24.01.2014 00:18
Ошибка в Компиляторе Visual Stdio 2008 MsWindows Общие вопросы C/C++ 2 02.07.2011 09:48
Ошибка в компиляторе visual c++ Kulikcha Visual C++ 0 30.06.2011 10:39
Ошибка в компиляторе Dj Crazy Помощь студентам 2 19.12.2010 15:33