Выявление унарного минуса в калькуляторе java - PullRequest
2 голосов
/ 10 апреля 2011

Привет, ребята, я почти закончил писать код и застрял в этой глупости.Я могу определить случаи, когда перед скобками стоит одинарный минус (- [4 + 4]).вот мой код:

package oop.ex2.expression;

import java.io.IOException;
import java.util.HashMap;
import oop.ex2.exception.*;
import oop.ex2.main.Tokenizer;

/**
 * This class contains 3 public static methods. All 3 methods are used
 * to parse text into a mathematical expression. The information is "thrown"
 * back and forth from one method to another.
 */
public class ExpressionParser {

    /**
     * This method uses expression() method to parse the text into mathematical
     * expressions, and returns an expression which is the sum of all
     * expressions returned from expression() [the sum is calculated according
     * to the right operator]
     *
     * @param st - the Tokenizer parsing the text
     * @return - Expression, the sum of all expressions from expression()
     * @throws InputException
     * @throws IOException
     */
    public static Expression sumExpressions(Tokenizer st)
            throws InputException, IOException {
        boolean endOfLine = false;
        Expression temp = expression(st);
        int token = Tokenizer.TT_NOTHING;
        while (!endOfLine) {
            token = st.nextToken();
            if ((token == Tokenizer.TT_OPERATOR)
                    || (token == Tokenizer.TT_OVERLOADED_OP))
                temp = new FatherExpression(st.op, temp, expression(st));
            else
                endOfLine = true;
        }
        return temp;

    }

    public static Expression expression(Tokenizer st) throws InputException, IOException {
        Expression result = null;
        switch (st.nextToken()) {
            case Tokenizer.TT_NUMBER:
                result = new NumberExpression(st.nval);
                break;
            case Tokenizer.TT_VARIABLE:
                result = new VariableExpression(st.sval);
                break;
            case Tokenizer.TT_FUNC:
                result = createFunction(st);
                break;
            case '[':
                result = sumExpressions(st);
                if (st.ttype != ']')
                    throw new BracketException("BracketException: "
                            + "one too many ']'");
                break;
            default:
                throw new UnexpectedTokenException("Unexpected token on" +
                        "ExpressionParser.elements(st)");
        }
        return result;
    }

    private static Expression createFunction(Tokenizer st)
            throws IOException, InputException {
        if (InlineManager.getAllInlineFunctions().containsKey(st.sval)) {
            InlineFunction temp = InlineManager.getInlineFunction(st.sval);
            temp.setArguments(st);
            return temp;
        }
        if (st.sval.equals("MAX"))
            return new Max(st);
        if (st.sval.equals("MIN"))
            return new Min(st);
        if (st.sval.equals("POW"))
            return new Pow(st);
        if (st.sval.equals("MOD"))
            return new Mod(st);
        if (st.sval.equals("ABS"))
            return new Abs(st);
        throw new FunctionNameException("Wrong funcion entred " + st.sval);
    }

    public static HashMap<String, Expression> parseArguments(Tokenizer st)
            throws IOException, InputException {
        HashMap<String, Expression> result = new HashMap<String, Expression>();
        if (st.nextToken() != '{')
            throw new UnexpectedTokenException("Missing {");
        int argument = 0;
        while (true) {
            st.ignoreToken(',', true);
            switch (st.nextToken()) {
                case '}':
                    st.ignoreToken(',', false);
                    return result;
                case '[':
                    result.put(String.valueOf(argument++), sumExpressions(st));
                    break;
                case Tokenizer.TT_NUMBER:
                    result.put(String.valueOf(argument++), new NumberExpression(st.nval));
                    break;
                case Tokenizer.TT_VARIABLE:
                    result.put(String.valueOf(argument++), new VariableExpression(st.sval));
                    break;
                case Tokenizer.TT_FUNC:
                    result.put(String.valueOf(argument++), createFunction(st));
                    break;
                default:
                    throw new UnexpectedTokenException("Unexpected token on function arguments");
            }
        }
    }
}

это давно я знаю.Объектом выражения может быть константа, переменная или функция, такая как MAX {3,2}, которая равна 3. expression () использует токенизатор, который я построил, для разбора текста в выражении, а sumExpression () использует expression () для созданияновое выражение, представляющее собой комбинацию двух объектов выражения в соответствии с правильным оператором.

я надеюсь, что его очистить.как я уже говорил, я не могу понять, как определить унарный минус (- [4] будет -4).я не поставил свой код токенизатора, не подумал, что это необходимо.

PS порядок вычислений определяется слева направо, независимо от типа оператора.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2011

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

1 голос
/ 11 апреля 2011

Может ли "I * идентифицировать случаи, когда есть унарный минус" опечатка?

Похоже, что если вы нажмете "+", "-", "*" или "/" в parseArguments, вы сразу создадите экземпляр класса InlineFunction и передадите токенайзер в качестве аргумента конструктору. Конструктор предполагает, что вещи по обе стороны от текущего токена являются аргументами этого оператора, и не знает, когда «-» фактически должен быть унарным. Это верно? Не могли бы вы показать нам этот конструктор?

Я бы подумал, что было бы довольно легко сказать, когда "-" должен быть проанализирован как унарный знак минус - это были бы места, где бинарный оператор недопустим: в начале строки или скобок /etc.-delimited group, сразу после другого оператора или в начале выражения в списке, разделенном запятыми (т. е. начало аргумента для ваших функций max, min и т. д.).

...