Шаблон проектирования для оценки логического выражения - PullRequest
1 голос
/ 22 марта 2019

Существует ли общий / определенный шаблон проектирования, который поможет запрограммировать оценщик для логических выражений.

Я пишу алгоритм сопоставления строк для таких выражений и ищу шаблон проектирования, который поможет структурировать алгоритм.

Пример ожидаемых строк -

"nike AND (tshirt OR jerseys OR jersey OR tshirts OR (t AND shirt)) AND black" 

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Ваше выражение в инфиксной записи . Чтобы оценить его, преобразуйте его в постфиксную запись .

Инфиксное выражение выглядит так:

<operand><operator><operand>

Постфиксное выражение выглядит так:

<operand><operand><operator>

Вы можете преобразовать свое выражение, используя Алгоритм Маневрового двора .

Когда выражение преобразуется, оценивает , используя этот подход (псевдокод):

Begin
   for each character ch in the postfix expression, do
      if ch is an operator ⨀ , then
         a := pop first element from stack
         b := pop second element from the stack
         res := b ⨀ a
         push res into the stack
      else if ch is an operand, then
         add ch into the stack
   done
   return element of stack top
End
0 голосов
/ 22 марта 2019

Я не знаю шаблона проектирования как такового, который бы соответствовал вашей проблеме, но если ваш язык программирования имеет поддержку регулярных выражений, мы можем достаточно легко написать такой шаблон:

(?=.*\bnike\b)(?=.*\b(?:tshirts?|jerseys?|t\b.*\bshirt|shirt\b.*\bt))(?=.*\bblack\b).*

Шаблон можно объяснить как:

(?=.*\bnike\b)   match "nike" AND

(?=.*\b(?:tshirts?|jerseys?|t\b.*\bshirt|shirt\b.*\bt))
    match tshirt(s), jersey(s) or "t" and "shirt" AND

(?=.*\bblack\b)  match "black"

.*               then consume the entire line

Демо

...