【问题标题】:parsing a Python expression from Java从 Java 解析 Python 表达式
【发布时间】:2014-02-16 05:39:41
【问题描述】:

我遇到了一个有趣的挑战

重点:

我希望允许用户在文本字段中输入表达式,并将该字符串视为 python 表达式。我想为这个表达式提供一些局部变量。

我确实有一个解决方案,但实施起来会很麻烦。我正在考虑保留一个 Python 类源文件,其中包含一个包含单个 %s 的函数。当用户输入他的表达式时,我们简单地做一个字符串格式,然后调用 Jython 的解释器,吐出一些我们可以执行的东西。在该表达式前面必须有许多变量声明语句,以确保我们想要向用户公开的变量用于他的表达式。

所以用户会看到一个文本字段,他会输入

x1 + (3.5*x2) ** x3

然后我们会做我们的解释过程来提出一个开放的委托对象。然后,我们将值从映射中打入该对象,并调用执行,以获取表达式的结果。

对使用 Jython 有任何反对意见,或者我应该做些什么而不是修改源代码?我想认为某种类似于 C# 的 Expression 对象的可变对象,我们可以在其中执行类似的操作

PythonExpression expr = new PythonExpression(userSuppliedText)
expr.setDefaultNamespace();
expr.loadLibraries("numPy", /*other libraries?*/);

//comes from somewhere else in the flow, but effectively we get
Map<String, Double> symbolValuesByName = new HashMap<>(){{
    put("x1", 3.0);
    put("x2", 20.0);
    put("x3", 2.0);
}};

expr.loadSymbols(symbolValuesByName);

Runnable exprDelegate = expr.compile();

//sometime later
exprDelegate.run();

但是,我希望很多,而且看起来 Jython 已经做到了最好。尽管如此,修改源文件然后将它们传递给解释器似乎真的很重。

这听起来是个好方法吗?你们还有其他推荐的库吗?


更新:NumPy 不适用于 Jython

我应该自己发现这个的。

所以现在我的问题转移了:有什么方法可以从单个 JVM 进程实例(意思是,无需分叉)编译和运行一些 Python 代码?

【问题讨论】:

  • 你需要支持像next(x**2 for x in {2, 3})这样的实际Python表达式,还是类似Python的表达式?
  • 为什么是 Python 表达式?表达式中需要支持哪些具体内容?
  • 需要python的权力。我建议使用 matlab 或 mathmatica,但我们想要 python。 Blender:不。如果我可以访问解析树(或 AST),我想对表达式执行“断言返回类型为双精度”,但我现在可以完全忽略错误检查。跨度>
  • python 的具体内容是什么?我想我毕竟可以从 python 语法中的 'expr' 产生:docs.python.org/2/reference/grammar.html
  • 你需要 NumPy 吗?如果您建议的替代品是 Matlab 和 Mathematica,听起来您很有可能需要 NumPy,而且我认为它不能与 Jython 互操作。

标签: java python parsing compiler-construction jvm


【解决方案1】:

如果你只是想解析表达式,你应该能够将一些东西与 Java 解析器生成器放在一起。

如果您想要解析、错误检查和评估表达式,那么您将需要一个完整的 Python 解释器功能的一个重要子集。

  1. 我不知道子集实现。

  2. 如果存在这样的子集实现,则不清楚嵌入/调用是否比使用完整的 Python 解释器...如 Jython 更容易。

如果权力要求“你应该使用 python”,那么他们需要为这将导致你的额外工作付出代价......以及下一个需要维护混合系统的人需求的变化,以及 Java 和 Python / Jython 生态系统的更新。将其纳入项目估算中。


另一种方法是解析完整的 python 表达式语法,但根据实际需要的内容以及项目时间范围内可实施的内容来限制评估者可以处理的内容。限制支持的类型和对类型的操作。限制支持的内置函数。等等。


假设你走 Java 调用 Jython 路线,这里有很多关于如何实现它的资料:http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2017-03-28
    • 2012-01-25
    • 2011-06-05
    • 2012-09-12
    • 2019-09-20
    相关资源
    最近更新 更多