假设我想编写一个自定义运算符来以一种重复的方式组成 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
?