如何在 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
我尝试了call
和dcg_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.
我想要一些更通用的解析器,例如 paren
需要一个解析器并将其用括号括起来:
paren(Parser, Result) -->
"(", some_magic_dcg_call(Parser, Result), ")".
:- phrase(paren(number, N), "(123)").
123
:- phrase(paren(someatom, A), "(a)").
a
我尝试了call
和dcg_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.