Как рекурсивно разобрать подстроки внутри скобок - PullRequest
0 голосов
/ 23 апреля 2019

Я пишу интерпретатор LISP на Java и пытаюсь создать функцию, которая может рекурсивно и динамически оценивать все аргументы внутри набора скобок в одно значение. Это должно решить любую комбинацию входных параметров, нуждающихся в оценке. Например, + 2 3 означает, что никакие параметры не должны быть решены, + (+ 1 2) (+ 1 2) означает, что оба параметра должны быть решены, + 1 (+ 1 2) означает, что должен быть решен только второй параметр, а + (+ 1 2) 1 означает, что требуется только первый параметр. решена. В этом я предполагаю, что все операции, которые могут быть выполнены, будут иметь только 2 параметра (+, -, *, / и т. Д.)

Я включил мой фрагмент того, что уже работает. Моя функция может решить ввод, если либо оба параметра должны быть решены, или если ни один из них не должен быть решен. Моя проблема в том, что я не могу понять, как проверить, нужно ли решать только один параметр. Примечание: я возвращаю результаты в виде строк специально.

public String test(String input) { //input comes in without outter-most parentheses

        String param1, param2;
        if (input.indexOf('(') != -1) { //'(' exists somewhere in the string

            int param1Start = input.indexOf('(');
            int iter = param1Start + 1;
            int c = 1;
            while (c != 0) { //loop through the string until the matching close parentheses is found
                if (input.charAt(iter) == '(')
                    c++;
                if (input.charAt(iter) == ')')
                    c--;
                iter++;
            }
            String subs1 = input.substring(param1Start + 1, iter - 1);

            param1 = test(subs1); //further evaluate the first parameter

            int param2Start = iter + 1;
            iter = param2Start + 1;
            c = 1;
            while (c != 0) { //loop through the string until the matching close parentheses is found
                if (input.charAt(iter) == '(')
                    c++;
                if (input.charAt(iter) == ')')
                    c--;
                iter++;
            }
            String subs2 = input.substring(param2Start + 1, iter - 1);
            param2 = test(subs2); //further evaluate the second parameter
        } else { //no parentheses left in string, solving time
            String[] splitter = input.split(" ", 3);

            return Integer.toString(Integer.parseInt(splitter[1]) + Integer.parseInt(splitter[2]));
        }
        return Integer.toString(Integer.parseInt(param1) + Integer.parseInt(param2));


    }

Может кто-нибудь найти способ проверить, нужно ли оценивать только один параметр? Или опубликовать лучшее решение Java?

...