将字符串公式解析为整数结果

时间:2011-11-22 14:04:46

标签: string delphi math formula

我正在做一些解析工作,太复杂而无法进入细节,但我需要做一件简单的事情(至少简单的概念,也许不是简单的答案)。我可能在字符串中有一个公式,如下面的示例。我需要一个函数,它将采用一个松散格式的公式字符串,解析出来并计算结果。

样品:

(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方法必须完全适用
  • 结果应始终为舍入的整数
  • 不存在已变换为数字的变量
  • 十进制数字可能是输入的一部分

我已经工作的现有解析只获取其中一个公式字符串 - 但从那里,我不知道如何执行实际计算。我正在做的具体是做一个用线条划分的脚本来绘制画布,这里是一些示例脚本:

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 @D+@S
Brush Color $00400000
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00501010
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00602020
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00703030
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00804040
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00905050
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)
Set D @D+@S
Brush Color $00FB6060
Ellipse @L+@D @T+@D @R-(@D*2) @B-(@D*2)

以@开头的任何内容都是变量,我根据StringReplace()部分声明的内容Var转换所有内容。

2 个答案:

答案 0 :(得分:3)

Parser10,最初由Renate Schaaf为Delphi 1编写,后来由Alin Flaider和Stefan Hoffmeister升级为Delphi2和3,是一个相当简单的数学解析器。它将完成简单表达式的工作,并可作为更复杂工作的样板。

它不是为速度而建的。

更新:

Hallvard Vassbotn更新了Parser10并添加了一些文档。从here加载。

答案 1 :(得分:0)

解析器,数学表达式评估器,计算器列表:here

[编辑] 或Delphi XE2中的TBindExpression,不确定它是否适用PEMDAS