【问题标题】:How to create a higher order DCG parser in Prolog?如何在 Prolog 中创建高阶 DCG 解析器?
【发布时间】:2020-06-02 13:47:19
【问题描述】:

我想要一些更通用的解析器,例如paren,它将接受一个解析器并用括号括起来:

paren(Parser, Result) -->
  "(", some_magic_dcg_call(Parser, Result), ")".


:- phrase(paren(number, N), "(123)").
123
:- phrase(paren(someatom, A), "(a)").
a

我尝试了calldcg_call,但它们似乎无法解决问题。如何在另一个解析器中运行任意解析器?

【问题讨论】:

标签: parsing prolog dcg


【解决方案1】:

这个使用call 的解决方案适用于 SWI-Prolog:

:- set_prolog_flag(double_quotes, chars).

paren(Parser, Result) -->
    "(",
    call(Parser, Result),
    ")".

number(123) -->
    "123".

someatom(a) -->
    "a".

测试:

?- phrase(paren(number, N), "(123)").
N = 123.

?- phrase(paren(someatom, A), "(a)").
A = a.

【讨论】:

  • 我一定犯了其他错误。这确实有效
  • Parser 应该是一个没有参数的非终端。但是对于call//2,您指的是缺少三个参数的谓词。是的,它几乎相同,但理想情况下,这两种不同的用途应该使用不同的构造。不确定,但phrase//2... 可能是一条出路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多