2011-08-16 87 views
2

所以這裏是我想要做的:在德爾福的數學解析器

我想解析器,將評估方程式,並允許我使用自定義函數。因此,例如,一個公式可能是:

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

聽起來像組件本身的錯誤或解析器更改:沒有源代碼,最好的選擇是[聯繫開發人員](http://www.myart.bz/mathparser/index.php?option=com_content&view = article&id = 11&Itemid = 13),並給他們一個小的演示程序,顯示問題(用數學表達式的模型和你需要調用的函數)。 –

回答

3

現在有幾種很好的免費解決方案來評估表達式。看看this question的答案。

+0

這些都是好主意,我也用'JvInterpreter'很多這樣的事情。它在JVCL中是免費的。 –

1

如果你確實有JVCL那麼它也有一個表達式評估組件 - JvInterpreter

+1

確實。開源MPL,所以你得到了源代碼,你可以修改它。 MathParser工具是商業用途,花費越多,功能/變量就越多。 –

+0

這是我會選擇的。 –

2

TbcParser做你想做的。它是Delphi的數學解析器組件。它允許自定義函數和變量。