Как разобрать арифметическое строковое выражение с отрицательными числами и знаками минус? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь проанализировать строку как с отрицательными числами, так и со знаком минус, и добавить каждый токен в очередь с именем infix и функцию, чтобы определить, является ли токен оператором.Тем не менее, негатив обрабатывается как знак минус и добавляется в очередь отдельно от отрицательного числа.Вот мой код, чтобы разбить строку на числа и добавить их в очередь.

for(int i = 0;i < expression.length();i++) // add all items from the expression to the infix queue
        {
            String value = String.valueOf(expression.charAt(i));

            if(eval.isOperator(value) == true)
            {
                infix.add(value);
            }
            else
            {
                for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)//add token to value until an operator is found and that number ends
                {
                    value += expression.charAt(j);
                    i++;
                }

                    infix.add(value);

            }
        }

и класс eval

public class Eval 
{
    public boolean isOperator(String n)
    {
        switch(n)
        {
        case "(":
            return true;
        case ")":
            return true;
        case "*":
            return true;
        case "/":
            return true;
        case "+":
            return true;
        case "-":
            return true;
        case "#":
            return true;
        }

        return false;
    }

    public int Priority(String op)
    {
        switch(op)
        {
        case "(":
            return 3;
        case "*":
            return 2;
        case "/":
            return 2;
        case "+":
            return 1;
        case "-":
            return 1;

        }
        return 0;
    }

}

    }

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Большинство языков справляются с этим, делая это позже.Как сказал @Sweeper, - будет оператором, и в дальнейшем код будет выбирать, является ли это двоичным или унарным оператором.Предполагая, что вы планируете оценить эти выражения в какой-то момент, выполнение этого способа на самом деле не будет слишком большой работой в конце.* из вашего цикла здесь

for(int j = i+1; eval.isOperator(String.valueOf(expression.charAt(j))) == false; j++)

Тогда это просто явная проверка:

if (value == "-" && isNumber(expression.charAt(j+1))
{
    // I assume you have access to some sort of isNumber function
    // and that you can check for an out of bounds access on your own 
    infix.add("-" + lexNumber(expression, j+1));
}
else if(eval.isOperator(value) == true)
{
     infix.add(value);
}
else
{ 
    // etc
}

Это грубый, непроверенный толчок в правильном направлении, который пропускает мелкие проблемы.В частности, проблема обновления индекса цикла.Я предлагаю новый класс для инкапсуляции источника выражения вместе с текущей позицией.Что-то вроде:

while (tokenStream.hasNext())
{
    infix.add(tokenStream.next());
}
0 голосов
/ 25 октября 2018
    public class Eval 
{
     boolean binaryOp = false;
    public boolean isOperator(String n)
    {
        switch(n)
        {
        case "(":
            return true;
        case ")":
            return true;
        case "*":
            ;
        case "/":
            ;
        case "+":
            binaryOp = true;
            return true;
        case "-":
                    If (binaryOp) break;
        case "#":
            return true;
        }
        binaryOp = false;
        return false;
     }
     public int Priority(String op)
    {
        switch(op)
        {
        case "(":
            return 3;
        case "*":
            return 2;
        case "/":
            return 2;
        case "+":
            return 1;
        case "-":
            return 1;

        }
        return 0;
    }

}
...