2015-03-29 2 views
-1

Так что я делаю переводчик 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()); 

Опять же, благодаря

+3

# 1: прочитайте javadoc в ['подстроке'] (http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-), чтобы убедиться у вас есть правильное представление о том, как это работает. Он часто путает людей, которые используются для подстроки операций на других языках. # 2: Если вы все еще смущены тем, как работает подстрока, задайте вопрос с приведенным примером, например. строку, параметры, то, что вы думаете, что это должно дать вам, и то, что это действительно дает вам. Я не хочу отслеживать кучу кода, чтобы ответить на вопрос о 'substring'. – ajb

ответ

4

Когда вы звоните openBracket() в первый раз, у вас есть i == 3 и brainfuck == "+++[>+++++ +++++<-]>+++.". Так, в первом substring() вызова вы получите:

String codeSection = brainfuck.substring(3); 

Какие результаты в:

String codeSection = "+++[>+++++ +++++<-]>+++.".substring(3); 
String codeSection = "[>+++++ +++++<-]>+++." 

Тогда вам проходное codeSection, чтобы увидеть, если она сбалансирована. Проблема в том, что вы уже вырезали часть перед [, но вы начинаете свой цикл с j = 3. Я буду отмечать текущие позиции индекса с (), так что легче следовать:

Вы начинаете цикл в j = 3:

[>+(+)+++ +++++<-]>+++. 

И идти до j = 14, что индекс - непосредственно перед ]:

[>+++++ +++++<(-)]>+++. 

Поскольку вы не нашли первый [ значение balance было 1 все это время. Итак, в конце концов, вы сделали endPoint = 14.

if (balance == 1) { 
    endPoint = j; 
} 

В следующей итерации вы найти ] и balance получает декрементируется к 0, так что цикл продолжает идти, но endPoint не обновляется снова.

После этого, вы делаете:

codeToRedo = brainfuck.substring(i, endPoint); 

Какие результаты в:

codeToRedo = brainfuck.substring(3, 14); 
codeToRedo = "+++[>+++++ +++++<-]>+++.".substring(3, 14); 
codeToRedo = "[>+++++ +++"; 

Я думаю, ваш цикл должен быть действительно:

for (short j = 0; j < codeSection.length(); j++) { ... } 

И, наконец, чтобы получить только часть brainfuck, которая находится между скобками, вы должны заметить это, а balance - 1, вы держите обновляя значение endPoint. Я думаю, что вы хотите остановиться, когда вы нашли балансировочный кронштейн, так что вы можете добавить break внутри вашего if:

for (short j = 0; 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; 
     break; // Stop when you find the ] position 
    } 
} 

Затем сделайте:

codeToRedo = brainfuck.substring(i + 1, i + endPoint); 

Или:

codeToRedo = codeSection.substring(1, endPoint); 

Также , вы объединяете результаты brainfuckExecute(), когда вы делаете output += brainfuckExecute(codeToRedo). Вероятно, это похоже на то, что он печатает дважды.

+0

Итак, я прочитал это, и я понимаю. Я получаю j = i, и я исправил это, но я не совсем понимаю, как исправить конечную проблему. И почему система System.out.println печатает дважды, когда она была вызвана один раз? И откуда 14? (Извините за то, что вы задали вопросы.) – null

+0

После добавления еще нескольких вещей он работает! Большое спасибо за Вашу помощь! – null