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

String 将字符串公式解析为整数结果,string,delphi,math,formula,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方法必须完全适用 结果应始终为四舍五入整数 不存在已转换为数字的变量 十进制数可能是输入

我正在做一些解析工作,太复杂了,无法深入细节,但我需要做一件简单的事情(至少是简单的概念,也许不是简单的答案)。我可能有一个字符串中的公式,如下面的示例。我需要一个函数,它将获取一个格式错误的公式字符串,解析它,然后计算结果

样本:

(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
部分中声明的内容转换所有变量。

解析器、数学表达式计算器和计算器列表:

[编辑] 或者Delphi XE2中的TBindExpression(不确定其是否应用PEMDAS)是一个相当简单的数学解析器,它最初由Renate Schaaf为Delphi 1编写,后来由Alin Flaider和Stefan Hoffmeister升级为Delphi2和Delphi3。它将完成简单表达式的工作,并可以作为更复杂工作的样板

但它不是为速度而建的

更新:


Hallvard Vassbotn对Parser10进行了更新,并添加了一些文档。从中加载。

到目前为止,您尝试了什么?你是想自己编写表达式解析器,还是想使用第三方代码?如果我有一台时间机器,我可以回到1985年为你买它!我知道我做过一次作业。绝地的JvExprParser真的没有帮你完成任务吗。我一直认为这是一个简单的即插即用的工作。是一个相当简单的数学解析器。看看它是否适合你,或者扩展它的功能。试试JVCL的一部分组件。它对我来说工作正常,但这里有一个链接:它们现在对我工作,那时一定已经停机了。