代码之家  ›  专栏  ›  技术社区  ›  sep

如何计算mathml表达式?[关闭]

  •  6
  • sep  · 技术社区  · 14 年前

    给定一些mathml内容:

    <apply>
      <eq/>
      <ci>c</ci>
      <apply>
        <plus/>
        <ci>a</ci>
        <ci>b</ci>
      </apply>
    </apply>
    

    std::map<std::string,std::double> cal;
    cal["a"] = 1.;
    cal["b"] = 2.;
    cal["c"] = 0; // does not matter what c is
    

    我想评估mathml并检索结果。有办法吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Pieter    14 年前

    mathml有语义和表示标记。因此不可能使用泛型mathml解析器进行计算。

    我不知道一个实际的实现,一些快速的谷歌搜索没有找到任何合理的结果,但它基本上归结为编写您的波兰语表达式解释器(如您给出的例子是在波兰语符号)。步骤:

    1. 获取XML解析器并读入文档
    2. 穿过树
    3. 如果遇到已知的操作或元素,请将其弹出堆栈
    4. 当子表达式完成时,解析它(或者更好:等待整个表达式完成,查找最后一个操作,使用它的arity指定的参数数执行它,并执行此操作,直到没有操作剩下)

    最后你会得到你的结果。

        2
  •  0
  •   Andrew Wagner    12 年前

    一种方法是找到一个可以导入mathml的计算机代数系统(cas)。不幸的是,虽然许多软件导出mathml,但几乎没有一个软件读取它。以下是一些cas系统的相关链接:

    casadi(严格来说不是cas,但可以计算表达式): https://sourceforge.net/apps/trac/casadi/ticket/149

    症状: http://code.google.com/p/sympy/issues/detail?id=2971

    Matlab/Mupad软件: http://www.mathworks.nl/help/toolbox/mupad/generate/MathML.html