Мой язык переводчика не распознает символ «+» и возвращает ошибки.Как я ошибся в своем коде? - PullRequest
0 голосов
/ 09 декабря 2018

Я написал интерпретатор, который принимает String в качестве набора инструкций.Этот набор команд объявляет набор переменных и возвращает одну из них.Пример набора команд:

A = 2
B = 8
C = A + B
C

Это должно вернуть переменную c и вывести 10 в консоли.Предварительные условия состоят в том, что левая сторона всегда должна быть буквой, правая сторона может содержать только одну цифру или добавление двух цифр, а оператор return всегда должен быть переменной.

Я написал следующий кодсделать это:

public class Interpreter2 {

public static int Scanner() {
    int returnStatement = 0;
    String num1;
    String num2;
    int sum = 0;
    ArrayList<String> variables = new ArrayList<String>();
    ArrayList<Integer> equals = new ArrayList<Integer>();
    //Input instruction set in the quotation marks below
    String input = "A = 2\n B = 8\n C = A + B\n C";
    String[] lines = input.split("\n"); //Split the instruction set by line

    for (String i : lines) {
        i = i.replaceAll("\\s", "");
        if (i.contains("=")) {          //If the line has an equals, it is a variable declaration   
            String[] sides = i.split("="); //Split the variable declarations into variables and what they equal
            variables.add(sides[0]);

            if (sides[1].contains("\\+")) { //If the equals side has an addition, check if it is a number or a variable. Convert variables to numbers and add them up
                String[] add = sides[1].split("\\+"); 
                num1 = add[0];
                num2 = add[1];
                for (int j = 0; j < variables.size(); j++) {
                    if (variables.get(j).equals(num1)) {    
                        num1 = Integer.toString(equals.get(j));
                    }   
                } 
                for (int k = 0; k < variables.size(); k++) {
                    if (variables.get(k).equals(num2)) {    
                        num2 = Integer.toString(equals.get(k));
                    }
                }
                sum = Integer.parseInt(num1) + Integer.parseInt(num2);
                equals.add(sum);
            }else { //If the equals side has no addition, it is simply equals to the variable
                equals.add(Integer.parseInt(sides[1]));
            }

        }else { //If the line does not have an equals, it is a return statement
            for (int l = 0; l < variables.size(); l++) {
                if (variables.get(l).equals(i)) {   
                    returnStatement = equals.get(l);
                }
            }
        }

    }
     return returnStatement;
}


public static void main(String[] args) {
        System.out.println(Scanner());
    }
}

Однако это дает ошибку

Exception in thread "main" java.lang.NumberFormatException: For input string: "A+B"

Это указывает на строку 39:

else { 
     equals.add(Integer.parseInt(sides[1]));
     }

Что заставляет меня думать, что мой if оператор, который находит, что в строке есть символ «+», он работает неправильно.Кто-нибудь может увидеть, что я пропустил?Я могу объяснить любой код, если это необходимо, это, вероятно, огромный беспорядок.

1 Ответ

0 голосов
/ 09 декабря 2018

Проблема в том, что String#contains не не принимает регулярное выражение.Он принимает CharSequence и:

Возвращает true тогда и только тогда, когда эта строка содержит указанную последовательность значений символов.

Так что вам не нужно экранировать+.Просто сделайте:

if (sides[1].contains("+"))
...