java 公式解析器_基于Java的简易表达式解析工具(二)

这篇博客介绍了如何使用Java实现一个简单的公式解析器,将算术表达式转换为逆波兰表达式。文章通过`ExpressionEvaluator`类展示了详细的过程,包括处理操作符优先级、括号匹配和计算。最后,提供了`eval`方法用于根据逆波兰表达式计算结果。
摘要由CSDN通过智能技术生成

public class ExpressionEvaluator {

private ExpressionEvaluator()

{

}

/**

* 将算术表达式转换为逆波兰表达式

* @param expression 要计算的表达式,如"1+2+3+4"

* @return

*/

private static List parseExpression(String expression)

{

if(StringUtils.isEmpty(expression)){

return new ArrayList();

}

List listOperator = new ArrayList(10);

Stack stackOperator = new Stack();

ExpressionParser expParser = new ExpressionParser(expression);

ExpressionNode beforeExpNode = null;       //前一个节点

ExpressionNode unitaryNode = null;         //一元操作符

ExpressionNode expNode;

//是否需要操作数

boolean requireOperand = false;

while ((expNode = expParser.readNode()) != null)

{

if ( (expNode.getType() == ExpressionNodeType.Numeric) ||

(expNode.getType() == ExpressionNodeType.String) ||

(expNode.getType() == ExpressionNodeType.Date))

{

//操作数, 直接加入后缀表达式中

if (unitaryNode != null)

{

//设置一元操作符节点

expNode.setUnitaryNode(unitaryNode);

unitaryNode = null;

}

listOperator.add(expNode);

requireOperand = false;

continue;

}

else if (expNode.getType() == ExpressionNodeType.LParentheses)

{

//左括号, 直接加入操作符栈

stackOperator.push(expNode);

continue;

}

else if (expNode.getType() == ExpressionNodeType.RParentheses)

{

//右括号则在操作符栈中反向搜索,直到遇到匹配的左括号为止,将中间的操作符依次加到后缀表达式中。

ExpressionNode lpNode = null;

while (stackOperator.size() > 0)

{

lpNode = stackOperator.pop();

if (lpNode.getType() == ExpressionNodeType.LParentheses) break;

listOperator.add(lpNode);

}

if (lpNode == null || lpNode.getType() != ExpressionNodeType.LParentheses)

{

throw new ExpressionException(String.format("在表达式\"%s\"中没有与在位置(%s)上\")\"匹配的\"(%s)\"字符!", expParser.getExpression(), expParser.getPosition()));

}

}

else

{

if (stackOperator.size() == 0)

{

//第一个节点则判断此节点是否是一元操作符"+,-,!,("中的一个,否则其它都非法

if (listOperator.size() == 0 &&

!(expNode.getType() == ExpressionNodeType.LParentheses || expNode.getType() == ExpressionNodeType.Not))

{

//后缀表达式没有任何数据则判断是否是一元操作数

if (ExpressionNode.IsUnitaryNode(expNode.getType()))

{

unita

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值