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 будут содержать синтаксическое дерево ...