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

问题描述 投票:0回答:1

我希望有一些更通用的解析器,比如说 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个回答
2
投票

这个解决方案使用 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.
© www.soinside.com 2019 - 2024. All rights reserved.