Преобразуйте нормальное инфиксное выражение в массив списков токенов - PullRequest
1 голос
/ 04 марта 2012

Я хочу преобразовать что-то вроде

233 + 4 * (4-8) + 5

в [233, +, 4, *, (, 4, -, 8,), +, 5]

Где последний - массив строк.

Пока у меня есть:

 String s = "233 + 4 *(4-8) +5";
 for(int i = 0; i<s.length(); i++)
    {
        int j = i + 1;
        String sub = s.substring(i,j);
        String checkdigit = s.substring(i,j);
        while(checkdigit.matches("\\d|\\.") && j<s.length())
        {
            checkdigit = s.substring(j,j+1);
            j++;
        }
        System.out.print(sub);
        if(!sub.equals(" ")) expression.add(sub);
    }

Но я получаю исключения нулевого указателя.Может ли кто-нибудь помочь мне исправить это?

Также, если бы кто-нибудь мог помочь мне разобрать это, чтобы он также принимал отрицательные значения (например, -5), это было бы полезно.

Редактировать: Кстати.предназначен для парных чисел (например, 5.0)

Редактировать 2:

Если кто-нибудь знает какие-либо классы Java API, которые могут заменить мой код, пожалуйста, покажите, как я могу заменить свой код на них.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2013

org.nfunk.jep.JEP работает для большинства сложных арифметических операций и идеально подходит для ваших требованийУбедитесь, что вы загружаете последнюю версию фляги (3.xx, я верю) для ее использования.2.x не поддерживает некоторые очевидные функции!

0 голосов
/ 04 марта 2012

Анализ арифметического выражения немного сложнее, чем кажется на первый взгляд (например, трудно отличить знак минус от отрицательного числа).

Хотя вы можете написать собственный анализатор, я рекомендуюиспользовать общий синтаксический анализатор (например, ANTLR или JavaCC ), предоставив ему нужную грамматику или искать более простую арифметическую библиотеку (например, JEP или некоторый эквивалент с открытым исходным кодом).

Вот ссылка, которая поможет вам использовать ANTLR для анализа арифметического выражения: http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

...