我希望有一些更通用的解析器,比如说 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.