2011-11-22 76 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

链接工程。我尝试了他们两个。 –