Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Общие темы > Болтовня

Болтовня Разговоры на любые темы (думайте, о чем пишите)

Ответ
 
Опции темы
Старый 15.04.2016, 16:35   #1
ant0N
Бывалый
 
Аватар для ant0N
 
Регистрация: 10.06.2011
Адрес: В горах
Сообщений: 849
Написано 331 полезных сообщений
(для 853 пользователей)
парсинг математического выражения

как правильно делается парсинг математического выражения из строки?
например "2*(1+2/2)"
мой ум сразу начал выдумывать пытки глазам.
__________________
Абсолютли!
(Offline)
 
Ответить с цитированием
Старый 15.04.2016, 17:00   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: парсинг математического выражения

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

/ 2 2 + 1 * 2

В реалиации это немного сложнее. Смотри тут, но там как-то муторно, как-то другую статью читал, там было лучше реализовано :
https://habrahabr.ru/post/122397/
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ant0N (15.04.2016)
Старый 16.04.2016, 22:58   #3
IgorOK
Мастер
 
Аватар для IgorOK
 
Регистрация: 26.10.2009
Сообщений: 1,194
Написано 615 полезных сообщений
(для 2,209 пользователей)
Ответ: парсинг математического выражения

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

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

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

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

Остальное можно разложить в стек или построить дерево выражения.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ant0N (17.04.2016)
Старый 17.04.2016, 00:41   #4
ant0N
Бывалый
 
Аватар для ant0N
 
Регистрация: 10.06.2011
Адрес: В горах
Сообщений: 849
Написано 331 полезных сообщений
(для 853 пользователей)
Ответ: парсинг математического выражения

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

посмотреть и потестить можно здесь (выражение в самом низу)
__________________
Абсолютли!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com