forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   парсинг математического выражения (http://forum.boolean.name/showthread.php?t=20267)

ant0N 15.04.2016 16:35

парсинг математического выражения
 
как правильно делается парсинг математического выражения из строки?
например "2*(1+2/2)"
мой ум сразу начал выдумывать пытки глазам.

RegIon 15.04.2016 17:00

Ответ: парсинг математического выражения
 
Цитата:

Сообщение от ant0N (Сообщение 305531)
как правильно делается парсинг математического выражения из строки?
например "2*(1+2/2)"
мой ум сразу начал выдумывать пытки глазам.

Ну как,изнутри, складывая операторы в стек, получается обраная польская запись.
Ищешь внутренние скобки, а в них потом по приоритету оператора. Для примера у тебя стек будет выглядеть так:

/ 2 2 + 1 * 2

В реалиации это немного сложнее. Смотри тут, но там как-то муторно, как-то другую статью читал, там было лучше реализовано :
https://habrahabr.ru/post/122397/

IgorOK 16.04.2016 22:58

Ответ: парсинг математического выражения
 
Парсинг собственно прост. Сначала разложи код на лексемы:

цифра(2), оператор(*), начало_выражения, цифра(1), оператор(+), цифра(2), оператор(/), цифра(2), конец_выражения.

Пишется процедура, которая посимвольно проверяет строку на соответствие какой либо группе. Например проверяем в твоём случае: находим символ 2. Предполагаем что это Int. Далее стоит символ "*". Он не подходит под определение Int. Добавляем 2 в список лексем как Int. Потом * туда же добавляем как оператор. И так далее, до конца строки.

Таким образом проверишь синтаксис выражения на простые ошибки. Вдруг кто-то напишет не 10+0.9, а 10+09.

Остальное можно разложить в стек или построить дерево выражения.

ant0N 17.04.2016 00:41

Ответ: парсинг математического выражения
 
все! сделал по польски
не сказал бы что это было легко, но я доволен.

посмотреть и потестить можно здесь (выражение в самом низу)


Часовой пояс GMT +4, время: 07:19.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot