Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Парсинг унарных операторов   Evgeniy Jirnov   22 Sep 2001 12:19:44 
 Парсинг унарных операторов   Yuri Khan   23 Sep 2001 09:30:57 
 Re: Парсинг унарных операторов   Pavel Fomin   23 Sep 2001 10:05:08 
 Паpсинг yнаpных опеpатоpов   Andrew V Sovgir   23 Sep 2001 21:53:42 
 Паpсинг yнаpных опеpатоpов   Evgeniy Jirnov   28 Sep 2001 17:23:38 
 Re: Паpсинг yнаpных опеpатоpов   Alexey Desyatnik   29 Sep 2001 09:28:30 
 Паpсинг yнаpных опеpатоpов   Dmitriy Nesmachny   07 Oct 2001 10:33:04 
 Паpсинг yнаpных опеpатоpов   Evgeniy Jirnov   18 Oct 2001 11:31:36 
 Паpсинг yнаpных опеpатоpов   Dmitriy Nesmachny   21 Oct 2001 11:13:12 
 Re: Паpсинг yнаpных опеpатоpов   Vadim Goncharov   25 Sep 2001 22:23:14 
Архивное /ru.algorithms/160653badc783.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional