2011-11-22 88 views
0

我正在做一些解析工作,太複雜到不了解細節,但有一件簡單的事情我需要做(至少簡單的概念,也許不是簡單的答案)。我可能會在字符串中使用一個公式,例如下面的示例。我需要一個函數,它將採用鬆散格式的公式字符串,將其解析出來並計算結果。解析字符串公式爲一個整數結果

樣品:

(10/2)+(10/30)

5+(10/30)

5+3

8

或者:

(12.5 - (0.5 * 5))/2

(12.5 - 2.5)/2

10/2

5

規則:

  • 空間將被忽略
  • PEMDAS方法必須完全適用
  • 結果應始終圓整
  • 沒有變量會存在,已經轉換爲數字
  • 十進制數可能是輸入

現有的解析我已經有工作剛剛得到這些公式的一個組成部分字符串 - 但從那裏,我不知道如何執行實際的計算。我在做什麼具體是做一個小行deliminated編劇畫在畫布,這裏的一些示例腳本:

Var W 50 
Var H 50 
Pen Style Clear 
Pen Color $000000 
Pen Width 3 
Brush Style Solid 
Brush Color {FORM_COLOR} 
Rect 0 0 {WIDTH} {HEIGHT} 
Brush Color $501010 
Ellipse @W @H 450 450 
Brush Color $602020 
Ellipse 100 100 400 400 
Brush Color $703030 
Ellipse 150 150 350 350 
Brush Color $804040 
Ellipse 200 200 300 300 
EllipseG 200 200 300 300 6 2 
Pen Style Solid 
Pen Width 2 
Pen Color {FONT_COLOR} 
MoveTo 0 0 
LineTo 500 500 
MoveTo 0 500 
LineTo 500 0 

所有已經工作,但現在我想說例如...

Var W 
Var H 
Set W 50 
Set H 50 
Brush Color $602020 
Ellipse(@W, @H, 500 - @W, 500 - @H 
Set W 100 
Set H 100 
Brush Color $703030 
Ellipse(@W, @H, 500 - @W, 500 - @H 
Set W 150 
Set H 150 
Brush Color $804040 
Ellipse(@W, @H, 500 - @W, 500 - @H 

所以500 - @W我已經將它轉換爲500 - 50,但現在我需要字符串500 - 50送入這個函數來得到結果450

編輯:解決

我使用推薦parser10因爲,它完全適用於什麼,我需要做的。下面是我的腳本代碼示例代碼段:

Var S 4 
Var D @S 
Var L 0 
Var T 0 
Var R {WIDTH} 
Var B {HEIGHT} 
Pen Style Clear 
Pen Color $00000000 
Pen Width 3 
Brush Style Solid 
Brush Color {FORM_COLOR} 
Rect 0 0 {WIDTH} {HEIGHT} 

Set D @[email protected] 
Brush Color $00400000 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00501010 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00602020 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00703030 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00804040 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00905050 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 
Set D @[email protected] 
Brush Color $00FB6060 
Ellipse @[email protected] @[email protected] @R-(@D*2) @B-(@D*2) 

任何開始的@是一個變量,這是我做的一個StringReplace()轉換基於什麼是在Var部分聲明所有。解析器

+1

你到目前爲止嘗試過什麼?你想自己編寫表達式分析器,還是想使用第三方代碼? –

+0

我試圖使用第三方解析代碼,這東西是一個荒謬的混亂。我相信至少有很多人已經制作了這樣的公式分析器 - 除了計算這些公式外,我至少已經做了這樣一個公式分析器 - 除了計算這些公式外,我還有一個空的函數shell'Calc(const Formula:String): Integer;' –

+3

如果我有時間機器,我可以回到1985年爲你準備好!我知道我曾經做過其中一件作爲作業。 –

回答

3

Parser10,通過雷娜特沙夫德爾福1最初寫後來由Alin Flaider和Stefan Hoffmeister升級到Delphi2和3,是一個相當簡單的數學解析器。它將完成簡單表達式的工作,並可以作爲更復雜工作的樣板。

它不是爲速度而建造的。

更新:

Hallvard Vassbotn由Parser10的更新並增加了一些文件。從here加載它。

+0

這一個做我想做的 - 將仍然調查其他人張貼... –

0

名單,數學表達式計算器,計算器:here

[編輯] 或者在Delphi XE2一個TBindExpression,不知道它的應用PEMDAS

+0

鏈接被打破。 –

+0

它對我來說工作很好,但是這裏的鏈接:http://www.efg2.com/Lab/Library/Delphi/MathFunctions/Parsers.htm –

+0

鏈接工程。我嘗試了他們兩個。 –