Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Алгоритм разбора выражения


Автор: Валерия 6.12.2007, 21:48
Нужно написать прогу которая сможет распознавать типа такого

((5+(3-2))*sin(2*2))/5

Как примерно такое делать smile?

Автор: Walker 7.12.2007, 08:16
Доброго времени суток, Валерия!

Тема уже http://forum.vingrad.ru/topic-181346.html. Без определённых соглашений никак. Пользователь может накатать любую ересь. Не знаю, какой вы придумали интерфейс, но могу предложить, например, следующее: Поле отображения формулы readonly - заполняется с помощью button, combobox, listbox и прочих контролов, которые могут предложить набор функций, ограниченный Вами.

Удачи!

Автор: esperant0 7.12.2007, 08:54
Цитата(Walker @ 7.12.2007,  08:16)
Доброго времени суток, Валерия!

Тема уже http://forum.vingrad.ru/topic-181346.html. Без определённых соглашений никак. Пользователь может накатать любую ересь. Не знаю, какой вы придумали интерфейс, но могу предложить, например, следующее: Поле отображения формулы readonly - заполняется с помощью button, combobox, listbox и прочих контролов, которые могут предложить набор функций, ограниченный Вами.

Удачи!

Вопрос почти наверняка на формальные грамматики и распознавание языка. И бутоны тут скорей всего не причем.


Валерия, построй грамматику для ваших выражений переведите грамматику в форму Хомского и распознавайте

Автор: NaOH 8.12.2007, 06:06
Я делал программку для распознования математических выражений на Делфи  smile 

Кто хочет, могу показать...

*

Автор: Валерия 8.12.2007, 13:55
NaOH, я хочу smile

Автор: 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
Цитата(Валерия @ 8.12.2007,  13:55)
NaOH, я хочу smile

Валерия, выложил на своей страничке (наз."интерпритатор") с исходниками  smile 

Может не только арифметические опреации распознавать, но и многие функции, напимер cos, sin, abs, tg, ln ...

Жду комментарии... smile 

Автор: Валерия 9.12.2007, 03:12
Спасибо, только в Дэлфи я не пишу а на C# smile
Да и уже не важно, я всетаки забила на это, и решила что бы после ввода текстовой строки, генерировалась и компилировалась другая программа, которая передает обратно результат smile
Всем спасибо smile

Автор: _Y_ 10.12.2007, 11:14
Я когда-то в древности писал парсер для логических выражений на VB. Если нужно - могу поискать.

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

Автор: Sartorius 10.12.2007, 11:22
 В .NET не нужно придумывать такие велосипеды. 
Код

object result = Microsoft.JScript.Eval.JScriptEvaluate("2+2", Microsoft.JScript.Vsa.VsaEngine.CreateEngine()));
 Console.WriteLine(result);

Автор: _Y_ 10.12.2007, 11:26
Цитата(Sartorius @ 10.12.2007,  11:22)
В .NET не нужно придумывать такие велосипеды.

Все зависит от степени стандартности задачи  smile 
Кстати, вот http://forum.vingrad.ru/index.php?showtopic=185548&view=findpost&p=1338378

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)