Разбор и оценка выражения X + Y% - PullRequest
0 голосов
/ 26 марта 2020

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

5+10%=5.5
5*10%=0.5

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

/**
 * Evaluates the given tree.
 *
 * @param elem The TreeElement can be either a leaf or a node
 * @return The value of the evaluated tree
 * @throws RuntimeException Division by zero
 */
private BigDecimal evaluateTreeElement(TreeElement elem){
    if(elem instanceof TreeNode){
        TreeNode node = (TreeNode) elem;

        BigDecimal left = evaluateTreeElement(node.getTreeLeft());
        BigDecimal right = evaluateTreeElement(node.getTreeRight());

        switch(node.getId()){
        case Tokenizer.TOKEN_ADD:
            return left.add(right);
        case Tokenizer.TOKEN_SUB:
            return left.subtract(right);
        case Tokenizer.TOKEN_MUL:
            return left.multiply(right);
        case Tokenizer.TOKEN_DIV:
            if(right.compareTo(BigDecimal.ZERO) == 0){
                throw new RuntimeException(ERROR_MESSAGE_DIVISION_BY_ZERO);
            }

            return left.divide(right, precision, RoundingMode.HALF_UP);
        default:
            return null;
        }
    } else {
        TreeLeaf leaf = (TreeLeaf) elem;

        return new BigDecimal(leaf.getSequence());
    }
}

Листья дерева - это значения. Одна из моих идей заключается в том, что я мог бы добавить еще один тип токена числа с процентом. Тем не менее, я также должен знать, что операция заранее. Как мы видим, в случае 5 + 10% 10% следует преобразовать в 0,5, где 5 * 10%, 10% следует преобразовать в 0,1.

Есть идеи, как мне решить эту проблему?

...