Так что я делаю переводчик brainfuck на Java, и у меня нет никаких проблем с ним, кроме [и]. (Неизбежно) Проблема заключается в разборе строки. Итак, что я делаю, чтобы справиться с циклом, найдите код между двумя скобками и вызовите функцию (Recursion), чтобы переделать код внутри скобок. Это звучит неплохо на бумаге, но substring
не сотрудничает со мной. Вот где я имею дело с [Java substr не работает как ожидалось
void openBracket(short i, String brainfuck)
{
/*LOGIC EXPLAINED: First set balance = 1, then loop through all characters after this,
if another opening bracket is found increment balance, if a close bracket is found,
decrement balance. Also, when another close bracket is found test if balance is 1, if
so then this is the proper bracket*/
String codeSection = brainfuck.substring(i);
short balance = 1;
String codeToRedo;
short endPoint = -1;
for (short j = i; j < codeSection.length(); j++)
{
//Check the character
if (codeSection.charAt(j) == '[')
{
balance++;
} else if (codeSection.charAt(j) == ']')
{
balance--;
}
//Check if it's the right bracket
if (balance == 1) {
endPoint = j;
}
}
//Only do such a thing if the cell is not equal to 0
if (cell[pointer] > 0 && endPoint != -1)
{
codeToRedo = brainfuck.substring(i, endPoint);
output += brainfuckExecute(codeToRedo);
}
else if (endPoint == -1) //If endpoint is equal to -1, that means that there was no closing bracket
{
errorList += "ERROR: No closing bracket (" + i + ")";
}
}
Извиняюсь о отступов, это не копия очень хорошо сформировать Netbeans. Но в любом случае, как вы можете видеть в верхней части кода, я делаю переменную, называемую «codeSection», и она должна содержать правильный текст. Вот то, что я даю для аргумента «Brainfuck»: +++[>+++++ +++++<-]>+++.
Вот что я получаю, когда я печатаю переменную:
[>+++++ +++++<-]>+++.
[>+++++ +++
Да, я печатать переменную с System.out.println и я получаю две разные вещи, напечатанные , В первый раз это правильная строка. Во второй раз я получаю обработанную, и у нее нет закрывающей скобки. У меня есть система проверки ошибок, сфальсифицированная в коде для мозгового укуса, поэтому я могу проверить. И я получаю сообщение об ошибке. (ОШИБКА: Без закрывающей скобки (0)) Я действительно ошеломлен и смущен этим, поэтому любая предоставленная помощь очень ценится.
P.S. Дополнительный код, как, где он называется и такое: Где это называется:
String brainfuckExecute(String brainfuck)
{
//Reset the output
output = "";
//Loop through all instructions
for(short i = 0; i < brainfuck.length(); i++)
{
//Execute a switch to do the instructions
switch(brainfuck.charAt(i))
{
//Increment current cell
case '+':
incrementCell();
break;
//Decrement current cell
case '-':
decrementCell(i);
break;
//Move pointer up
case '>':
incrementPointer(i);
break;
//Move pointer down
case '<':
decrementPointer(i);
break;
//Get user input and store it in the current cell
case ',':
getInput();
break;
//Add the cell to the output string
case '.':
addOutput();
break;
//Start the while loop -- Recurssive
case '[':
openBracket(i, brainfuck);
break;
}
}
//Return said output
return output;
}
(Это внутри класса, который имеет все эти переменные) где основной является:
Brainfuck codeTranslator = new Brainfuck();
System.out.println(codeTranslator.brainfuckExecute("+++[>+++++ +++++<-]>+++."));
System.out.println(codeTranslator.getErrors());
Опять же, благодаря
# 1: прочитайте javadoc в ['подстроке'] (http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-), чтобы убедиться у вас есть правильное представление о том, как это работает. Он часто путает людей, которые используются для подстроки операций на других языках. # 2: Если вы все еще смущены тем, как работает подстрока, задайте вопрос с приведенным примером, например. строку, параметры, то, что вы думаете, что это должно дать вам, и то, что это действительно дает вам. Я не хочу отслеживать кучу кода, чтобы ответить на вопрос о 'substring'. – ajb