【问题标题】:Java 1.5: mathematical formula parserJava 1.5:数学公式解析器
【发布时间】:2010-10-27 09:45:28
【问题描述】:

您好,我经常开发 JTableModel,其中一些单元格必须包含应用某个简单数学公式的结果。这个公式可以有:

  • 运算符(+、-、*、/)
  • 数字常量
  • 其他单元格引用(包含数字)
  • 参数(参考名称如“INTEREST_RATE”的数字)

我经常解决它,制作一个解析公式的小计算器类,我定义的语法。计算器类使用堆栈进行计算,语法始终使用波兰表示法。

但是波兰符号对我和我的用户来说都是不自然的。所以我的问题是……

是否有一个在 1.5 jvm 中运行的库,可以处理我的请求并使用普通表示法(带括号,我不知道这种表示法样式的名称)用于公式?

P.D 假设公式总是语法正确,我可以预处理不是常量的数字以提供它们的值

【问题讨论】:

    标签: java parsing math formula


    【解决方案1】:

    你想过JSR-223 的好处吗?简而言之,这个规范allows Java developers 可以轻松集成dynamic languages and their parsers。使用这样的解析器,您对定义解析器的需求转变为对定义 internal DSL 的需求,这解决了创建一个好的 API,并让您的用户选择他们喜欢的 Javascript/Groovy/Scala/WTF 语法他们碰巧喜欢.

    【讨论】:

    • 这似乎是一个很好的方法,我会调查它,但遗憾的是我需要它在 jvm 1.5 中运行。我会更新我的问题
    • 这确实有效,但我不能使用它,因为 1.5 的限制。如果没有人为 java 1.5 提供更好的答案,我会将问题更改为原始问题并接受您的答案
    • 最后,正如我在您提供的第二个链接中看到的,如果您从jcp.org/aboutJava/communityprocess/final/jsr223/index.html 下载参考实现,则可以在 1.5 中使用 ScriptingEngine
    【解决方案2】:

    试试JEP

    您可以为解析器定义新变量,因此它可以包含诸如“INTEREST_RATE”之类的引用名称。但您必须事先定义它。

    至于单元格引用,您必须提取数字并相应地编辑表达式,或者可能有一些我还不知道的选项。

    【讨论】:

      【解决方案3】:

      如果您不能使用 Java 6 及其脚本支持,请查看Apache Bean Scripting Framework (BSF)。从该页面:

      ... BSF 3.x 将在 Java 1.4+ 上运行,允许访问 Java 1.4 和 Java 1.5 的 JSR-223 脚本。

      【讨论】:

      • 我可以使用参考实现 JSR-223 从 1.5 开始使用 int,但感谢您的回答
      【解决方案4】:

      我发布了一个基于Dijkstra's Shunting Yard算法的表达式评估器,在Apache License 2.0的条款下:

      http://projects.congrace.de/exp4j/index.html

      【讨论】:

        【解决方案5】:

        有一个名为formula4j 的商业工具可能对某些人有用。

        它对单元格引用没有直接帮助。您必须自己处理这些,并将单元格引用转换为值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-07
          • 1970-01-01
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          相关资源
          最近更新 更多