我如何评估某个公式?

我有一个multidimension arrayList,我问用户一个公式,而不是我评估它。 问题是我得到这样的用户输入:

((a1+a2)/12)*a3 

问题是a1和a2和a3引用了列,我必须将它评估为某个值,我完全迷失了如何处理这个问题,任何建议或指导都会很棒。 此计算值也必须每次更新任何列中的值时更新。 事情是公式不是硬编码。

可能性是写一种解析器。 最好使用二叉树结构来表示表达式,而不是列表。

每个非叶节点都是一个操作,每个叶子都是操作数。

树

就个人而言,我会尽力避免所有解析内容,并寻找一个允许您使用自己的变量解析器的EL库。 您需要做的就是将变量连接到您的支持模型。 (在您的情况下,分割单词/字母边界,并查找单元格内容。)

这也允许您通过简单地将它们暴露给EL引擎来包含任意函数。 像OGNL,MVEL等等可能是一个很好的起点。 似乎更容易。

Heisenbug建议的替代方案是尝试Dijkstra的分流码算法 。 您可以使用堆栈和队列,而不是依赖树结构。 优点是所涉及的这些数据结构并不十分复杂。 缺点是可能很容易错过实现算法的任何错误,因为您需要彻底了解所涉及的操作,以了解您的实现是否正确。

您需要将公式转换为二进制表达式树 。 这应该不是那么困难。

然后,您将需要遍历此树以评估开始时的表达式值以及每次arrayList中的值更改时。 首先集中精力构建树,并在评估时获得正确的值。 不要忘记负数和变量! 在那之后,观察arrayList的变化应该是微不足道的。