如何在 Prolog 中创建高阶 DCG 解析器?

How to create a higher order DCG parser in Prolog?

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

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


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

我尝试了calldcg_call,但他们似乎没有解决问题。我怎样才能 运行 另一个解析器中的任意解析器?

此解决方案使用 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.