【发布时间】:2019-01-04 20:52:12
【问题描述】:
假设我想编写一个自定义运算符来以一种重复的方式组合 DCG 规则。
例如,假设我有一个 DCG,ws,这样:
ws --> [].
ws --> " ", ws.
匹配零个或多个空格。显然,如果我想要语法中每个标记之间的可选空格,则必须将, ws 放在任何地方是令人讨厌的。
我可以定义一个新的运算符来替换,/2。
:- op(1000, xfy, [ -- ]).
:- meta_predicate --(*,*,?,?).
--(L,R) --> ({callable(L)} -> call(L); L), ws, ({callable(R)} -> call(R); R).
这通过可选的空白规则连接--/2 的左右手。这大部分都可以正常工作,但是某些事情会出错:
rule --> "foo" -- ("bar"; "quux").
如果我尝试执行此规则,我会收到一条错误消息,指出未定义 ;/4。我对这里的问题有一个模糊的概念,但基本上问题是:有没有办法为 DCG 定义与,/2 具有相同通用性的新运算符?
【问题讨论】:
-
请使用
2代替*。即::- meta_predicate --(2,2,?,?). -
如果您要删除您的question,请不要期望得到答案。
标签: prolog dcg meta-predicate