【问题标题】:Parsing a string formula to an integer result将字符串公式解析为整数结果
【发布时间】:2011-11-22 14:04:45
【问题描述】:

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

示例:

(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,它非常适合我需要做的事情。这是我的脚本代码的示例 sn-p:

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 部分中声明的变量。

【问题讨论】:

  • 到目前为止你尝试过什么?你想自己写表达式解析器,还是想使用 3rd 方代码?
  • 如果我有一台时光机,我可以回到 1985 年,为你得到它!我知道我曾经把其中一个作为家庭作业。
  • JEDI 的 JvExprParser 真的无法为您完成工作吗?我一直认为这是一个简单的即插即用工作。
  • Parser10 是一个相当简单的数学解析器。看看它是否适合你,或者扩展它的功能。
  • 试试 JvInterpreter 组件,它是 JVCL 的一部分。

标签: string delphi math formula


【解决方案1】:

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

虽然它不是为速度而构建的。

更新:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多