Я занимаюсь разработкой парсера / оценщика и в настоящее время поддерживаю сложение, вычитание, умножение, деление и скобки. Следующим шагом, который я хотел бы реализовать в моем анализаторе / оценщике, является знак процента. Несколько примеров:
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.
Есть идеи, как мне решить эту проблему?