Разбор строковой формулы в целочисленный результат - PullRequest
1 голос
/ 22 ноября 2011

Я выполняю некоторую парсинговую работу, слишком сложную, чтобы вдаваться в подробности, но есть одна простая вещь, которую мне нужно сделать (по крайней мере, простая концепция, возможно, не простой ответ).Я мог бы иметь формулу в строке, как примеры ниже.Мне нужна функция, которая возьмет строку формулы в произвольном формате, проанализирует ее и вычислит результат.

Пример:

(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 должен применяться полностью
  • Результат должен быть всегда округленным целым числом
  • Никаких переменных не будет, уже преобразованы в числа
  • Десятичные числа могут быть частью ввода

Существующий синтаксический анализ I ужеЯ получаю только одну из этих строк формул, но я не знаю, как выполнять реальные вычисления.В частности, я делаю небольшой сценарий с разделителями строк для рисования на холсте, вот несколько примеров сценариев:

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 ]

3 голосов
/ 22 ноября 2011

Parser10 , изначально написанный Ренате Шааф для Delphi 1 и позднее обновленный до Delphi2 и 3 Алин Флайдер и Стефаном Хоффмайстером, является довольно простым математическим парсером.Это сделает работу для простых выражений и может служить образцом для более сложной работы.

Хотя он не построен для скорости.

Обновление:

Хольвард Вассботн сделал обновление Parser10 и добавил некоторую документацию.Загрузите его с здесь .

0 голосов
/ 22 ноября 2011

Список парсеров, оценщиков математических выражений, калькуляторов: здесь

[Изменить] Или TBindExpression в Delphi XE2, не уверен, что его применение PEMDAS

...