Пролог: Как использовать анализатор DCG для анализа оператора if - then - else - PullRequest
0 голосов
/ 17 января 2012

Можно ли использовать Prolog DCG для анализа оператора if-then-else? Если да, то как можно проанализировать такое утверждение, учитывая, что я должен сопоставить конкретные строки «если», «тогда» и «еще». Если это невозможно, каковы мои альтернативы?

1 Ответ

0 голосов
/ 17 января 2012

DCG идеально подходят. Но, будучи голым Прологом, вы должны сделать некоторый выбор, чтобы использовать силу и реализовать что-либо практичное. Например, когда это возможно, я применяю DCG непосредственно к текстовому источнику, без предварительного токенизатора. Если это уместно, зависит от конкретной задачи. Давайте предположим, что здесь все в порядке. Тогда наш DCG может быть реализован в SWI-Prolog, используя доступную вспомогательную библиотеку:

:- [library(http/dcg_basics)].

conditional(if_then_else(Cond, Then, Else)) -->
  blanks, "if",
  blanks, bool_expression(Cond),
  blanks, "then",
  blanks, statement(Then),
  blanks, "else",
  blanks, statement(Else).

Очень просто, не правда ли?

Этот другой ответ показывает, как анализировать (и оценивать) выражения с учетом приоритета. Вы можете легко расширить его с помощью логических операторов, просто предоставьте им правильный приоритет. Заявление типично позволит назначений и возьмет на себя условно.

Вы должны обратить внимание на использование заготовок // 0, что, возможно, является производством с пустым соответствием. может привести к некоторой неэффективности, если появится «рядом» с другим производством с тем же свойством.

Когда определены bool_expression // 1 и оператор // 1, анализатор может быть вызван:

...,
phrase(conditional(C), "  if 1 < 2 then a = 1 else a = 0  "),
...

и C будут содержать синтаксическое дерево ...

...