【发布时间】:2014-02-03 20:58:49
【问题描述】:
是否可以使用 Prolog DCG 来解析“if-then-else”语句?如果是这样,考虑到我必须匹配特定的“if”“then”“else”字符串,如何解析这样的语句。如果这不可能,我的替代方案是什么?
【问题讨论】:
是否可以使用 Prolog DCG 来解析“if-then-else”语句?如果是这样,考虑到我必须匹配特定的“if”“then”“else”字符串,如何解析这样的语句。如果这不可能,我的替代方案是什么?
【问题讨论】:
DCG 非常适合。但是作为准系统 Prolog,您必须做出一些选择来利用功能并实现任何实用的东西。 例如,如果可能的话,我直接在文本源上应用 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).
很简单,不是吗?
这个other answer 展示了如何解析(和评估)表达式,考虑优先级。您可以使用布尔运算符轻松扩展它,只需给它们正确的优先级。声明通常将允许分配,并将在条件下递归。
您必须注意空格//0的使用,可能是“空匹配”产生式 如果与具有相同属性的其他产品“并排”出现,可能会导致效率低下。
当 bool_expression//1 和 statement//1 都被定义后,就可以调用解析器了:
...,
phrase(conditional(C), " if 1 < 2 then a = 1 else a = 0 "),
...
而 C 将包含语法树...
【讨论】: