【问题标题】:Prolog: How to use DCG parser to parse an if - then - else statementProlog:如何使用 DCG 解析器解析 if - then - else 语句
【发布时间】:2014-02-03 20:58:49
【问题描述】:

是否可以使用 Prolog DCG 来解析“if-then-else”语句?如果是这样,考虑到我必须匹配特定的“if”“then”“else”字符串,如何解析这样的语句。如果这不可能,我的替代方案是什么?

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

    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 将包含语法树...

    【讨论】:

    • 谢谢!我一定会试试这个!
    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多