|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Pavel Fomin 2:5026/49.21 23 Sep 2001 10:05:08 To : Evgeniy Jirnov Subject : Re: Парсинг унарных операторов --------------------------------------------------------------------------------
22 Sep 01 11:19, you wrote to All:
EJ> Подскажите как сабж делать? Как с бинарным оператором понятно:
EJ> (2+2)+(3+3) Просто смотрим что справа и слева от оператора и, если
EJ> справа или слева скобки, то переходим к скобках, а далее снова
EJ> смотрим что там и как... А как сделать такое: Tg(Sin(2+2)+Cos(3+2))
Я разбор делал так (разбор в дерево):
1) каждый оператор (+-*/= :=) обладает своим приоритетом.
2) начинаем разбор с некоторым приоритетом (обычно минимальным). текущий
результат nil.
3) выделяем очередной токен (число - оператор - идентификатор - выражение в
скобках)
4) Если число - создаем соответствующий элемент дерева и заносим в текущий
результат. goto 3.
5) если функция/переменная - разбираем параметры, создаем соответствующий
элемент дерева и заносим в текущий результат. goto 3.
6) если выражение в скобках - разбирать (рукурсивно) выражение в скобках,
полученный результат (дерево выражения) заносим в текущий. goto 3.
7) если оператор (арифметический +-,etc), смотрим на приоритет. если приоритет
выше того, с каким начали разбор, то создается новый узел дерева, текущее
дерево заносится как левое поддерево свежесозданного, далее рекурсивно
разбираем выражение с приоритетом данной операции, результат заносим в правое
поддерево. Как всегда результат заносится в текущий. goto 3. иначе (приоритет
меньше либо равен) заканчиваем текущий разбор. Таким образом для выражения
a+b*c-d после нахождения + для правой части будет разобрано b*c и остановка
произойдет на -. Единственное исключение для унарных + и -. Унарный + я
игнорировал, а унарный - я превращал в бинарный (-x в 0-x)
8) если не встретилось ничего из 4-7, завершаем текущий блок разбора.
a+b*c-d будет разобрано в
(-)
/ \
(+) (d)
/ \
(a) (*)
/ \
(b) (c)
Разумеется, если требуется вычислить выражение без заморочек и дерево строить
не требуется, то там, где сказано "создаем дерево" читать вычисляем.
Pasha 1st, RU.(PASCAL[.SOURCES|.CHAINIK|.ASM]|ACM)
... Говорила мне мама: "Hе лезь в системщики"
--- GoldED/W32 3.0.1-asa9 SR3
* Origin: Windows имеет всех, кто ее имеет (2:5026/49.21)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/160653badc783.html, оценка из 5, голосов 10
|