德尔福的数学解析器

时间:2011-08-16 14:20:19

标签: delphi

所以这就是我想要做的事情:

我想要一个能够评估方程并允许我使用自定义函数的解析器。因此,例如,一个等式可以是:

cos(5) * Patient:['lat1'] 

它会让我有一个功能,如果它找到患者:在表达式中。

我正在使用的程序使用了一个名为MathParser(http://www.myart.bz/mathparser/)的解析器,它在Delphi 2007中运行良好,但在Delphi XE中有问题(因为unicode)。 MathParser网站有一个新版本的XE,我安装了它,但是一些功能已经改变了,我试图让它正常工作。

所以,问题似乎与自定义函数部分有关,因为其他一切正常。

我添加功能的方式是:

MathParser.AddFunction('Patient:', FPatFunction, fkMethod, FunctionMethod(PatFunction, 1),
False, False, vtDouble);
MathParser.AddFunction('Organ:', FOrgFunction, fkMethod, FunctionMethod(OrganFunction, 1),
False, False, vtDouble);

然后功能本身就是

// patient function
function CEquatCalc.PatFunction(const AFunction: PFunction; const AType: PType;
 const ParameterArray: TParameterArray): TValue;
 begin
  if Assigned(FPatient) and Assigned(FOrgan) then
   AssignDouble(Result, (FPatient as CPatientItem).GetScoreVal((Trim(ParameterArray[0].Text)), (FOrgan as COrganItem)))
  else if Assigned(FPatient) then
   AssignDouble(Result,(FPatient as CPatientItem).GetScoreVal((Trim(ParameterArray[0].Text)), NIL));

端;

// organ function
function CEquatCalc.OrganFunction(const AFunction: PFunction; const AType: PType;
 const ParameterArray: TParameterArray): TValue;
 begin
  AssignDouble(Result, (FOrgan as COrganItem).GetScoreVal((Trim(ParameterArray[0].Text))));
 end;

弹出的错误表示“未知元素:lat1”。不幸的是,由于组件没有附带Parser.pas(只是dcu文件),我无法调试它发生的位置。

希望有人知道问题是什么,如果没有,你能推荐另一个能做我想做的解析器吗? (并且最好是免费的)

4 个答案:

答案 0 :(得分:3)

现在有几个很好的免费解决方案可用于在运行时评估表达式。查看this question的答案。

答案 1 :(得分:2)

TbcParser做你想要的。它是Delphi的数学解析器组件。它允许自定义函数和变量。

答案 2 :(得分:1)

如果你确实有JVCL,那么它也有一个表达式评估组件 - JvInterpreter

答案 3 :(得分:0)

不确定它是否完全符合您的要求,但您可以Pegtop math components 一试。