Предположим, я хочу написать собственный оператор для составления правил 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,?,?)
. - person false   schedule 01.08.2018