所以这就是我想要做的事情:
我想要一个能够评估方程并允许我使用自定义函数的解析器。因此,例如,一个等式可以是:
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文件),我无法调试它发生的位置。
希望有人知道问题是什么,如果没有,你能推荐另一个能做我想做的解析器吗? (并且最好是免费的)
答案 0 :(得分:3)
现在有几个很好的免费解决方案可用于在运行时评估表达式。查看this question的答案。
答案 1 :(得分:2)
TbcParser做你想要的。它是Delphi的数学解析器组件。它允许自定义函数和变量。
答案 2 :(得分:1)
如果你确实有JVCL,那么它也有一个表达式评估组件 - JvInterpreter。
答案 3 :(得分:0)
不确定它是否完全符合您的要求,但您可以Pegtop math components 一试。