微分方程的Python解析器:带有ast和sympify的语法错误

时间:2016-02-17 16:52:57

标签: python parsing abstract-syntax-tree sympy ode

我正在尝试解析(普通)微分方程。理想情况下,我更喜欢使用现有的解析器 - 否则,这会直接导致语法等问题,并且可能相当费力。

编辑:我们的想法是将方程式提供给SymPy的求解器和积分器,并用它做一些与问题无关的东西。

我找到了list自定义解析器,但它似乎有些过时,似乎没有提到我正在寻找的东西。

到目前为止,我已尝试 ast (我认为使用了compile())和同意,但没有成功:

lagrangeODE = '''f''(x) + f'(x) + f(x)'''

import ast
tree = ast.parse(lagrangeODE)

生成

tree = ast.parse(lagrangeODE)
  File "<unknown>", line 1
    f''(x) + f'(x) + f(x)
      ^
SyntaxError: invalid syntax

import sympy as sy
expr = sy.sympify(lagrangeODE)

产生

---------------------------------------------------------------------------
SyntaxError                               Traceback (most recent call last)
[...]
SympifyError: Sympify of expression 'could not parse "f''(x) + f'(x) + f(x)"' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

对我来说,这基本上意味着ast和sympify不理解有关ODE的Langrangian符号。

请告知:

  1. 我使用ast并且表示错误,或者他们不适合 任务?
  2. 是否有另一种现有方式,或者我应该实施一种方式 自己?

1 个答案:

答案 0 :(得分:4)

public class EmployeeItem { public string Id { get; set; } [JsonProperty(PropertyName = "Name")] public string Name { get; set; } [JsonProperty(PropertyName = "Email")] public string Email { get; set; } [JsonProperty(PropertyName = "EmployeeID")] public int EmployeeID { get; set; } [JsonProperty(PropertyName = "Department")] public string Department { get; set; } [JsonProperty(PropertyName = "PrivledgeLevel")] public string PrivledgeLevel { get; set; } } 模块旨在解析Python。你的输入不是Python。同样,ast旨在解析看起来像SymPy语法的字符串,而sympify不是SymPy语法。这两种工具都不适合您的任务。

获取通用解析器生成器并编写语法。 pyparsing将是一种选择。