Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Алгоритм разбора выражения |
Автор: Валерия 6.12.2007, 21:48 |
Нужно написать прогу которая сможет распознавать типа такого ((5+(3-2))*sin(2*2))/5 Как примерно такое делать ![]() |
Автор: Walker 7.12.2007, 08:16 |
Доброго времени суток, Валерия! Тема уже http://forum.vingrad.ru/topic-181346.html. Без определённых соглашений никак. Пользователь может накатать любую ересь. Не знаю, какой вы придумали интерфейс, но могу предложить, например, следующее: Поле отображения формулы readonly - заполняется с помощью button, combobox, listbox и прочих контролов, которые могут предложить набор функций, ограниченный Вами. Удачи! |
Автор: esperant0 7.12.2007, 08:54 | ||
Вопрос почти наверняка на формальные грамматики и распознавание языка. И бутоны тут скорей всего не причем. Валерия, построй грамматику для ваших выражений переведите грамматику в форму Хомского и распознавайте |
Автор: NaOH 8.12.2007, 06:06 |
Я делал программку для распознования математических выражений на Делфи ![]() Кто хочет, могу показать... * |
Автор: Валерия 8.12.2007, 13:55 |
NaOH, я хочу ![]() |
Автор: dereyly 8.12.2007, 17:09 |
Обычно строят дерево арифмитических выражений, можно так же через префиксную форму ((5+(3-2))*sin(2*2))/5 ~ [3] [2] [-] [5] [+] [2] [2] [*] [sin] [*] [5] [/] В моем фиговом интерпретаторе это работало через 2 стека (только непомню как я там унарный минус обходил) Стек операндов(чисел): [3] [2] [5] [2] [2] [5] Стек операций [-] [+] [*] [sin] [*] [/] (Будем читать стек слева направо) Берем первую операцию [-], она требует 2 операнда (т.е. мы минус не считаем унарным), далее берем [3] [2] и вычисляем 3-2=1 и записывем в стек результат у нас получится 2. [1] [5] [2] [2] [5] [+] [*] [sin] [*] [/] 3. [6] [2] [2] [5] [*] [sin] [*] [/] 4. [12] [2] [5] [sin] [*] [/] 5. [-0.54] [2] [5] [*] [/] 6. [-1.04] [5] [/] 7. [-0.22] [] Понятно что последнее число оставшееся в стеке есть ответ Так же следует рассмотреть 3 случая 1. Стек 1 содержит больше 1й цифры 2. Стек 2 не пуст 3. Оператору не хватает операндов Все случаи значат что исходное выражение составлено не правильно |
Автор: NaOH 8.12.2007, 17:40 | ||
Валерия, выложил на своей страничке (наз."интерпритатор") с исходниками ![]() Может не только арифметические опреации распознавать, но и многие функции, напимер cos, sin, abs, tg, ln ... Жду комментарии... ![]() |
Автор: Валерия 9.12.2007, 03:12 |
Спасибо, только в Дэлфи я не пишу а на C# ![]() Да и уже не важно, я всетаки забила на это, и решила что бы после ввода текстовой строки, генерировалась и компилировалась другая программа, которая передает обратно результат ![]() Всем спасибо ![]() |
Автор: _Y_ 10.12.2007, 11:14 |
Я когда-то в древности писал парсер для логических выражений на VB. Если нужно - могу поискать. Естественно, что пользователь должен знать правила написания выражения: что скобки должны быть парными и т.п. |
Автор: Sartorius 10.12.2007, 11:22 | ||
В .NET не нужно придумывать такие велосипеды.
|
Автор: _Y_ 10.12.2007, 11:26 | ||
Все зависит от степени стандартности задачи ![]() Кстати, вот http://forum.vingrad.ru/index.php?showtopic=185548&view=findpost&p=1338378 |