Графические токены могут служить операторами Пролога, которые не требуют одинарных кавычек.
Перевод ISO / IEC 13211-1: 1995, 6.4.2 «Синтаксис.Tokens.Names»:
graphic_token --> kleene_plus(graphic_token_char).
graphic_token_char --> member("#$&*+-./:<=>?@^~\\").
% some auxiliary code
kleene_plus(NT) --> NT, kleene_star(NT).
kleene_star(NT) --> "" | kleene_plus(NT).
member(Xs) --> [X], { member(X,Xs) }.
Подраздел 6.4.1 «Синтаксис.Tokens.Layout Text» добавляет следующее ограничение:
Графический токен не должен начинаться с последовательности символов comment open
(т. Е. "/*
").
Обеспечение этого ограничения в DCG не представляет особой проблемы ...
graphic_token --> graphic_token_char. % 1 char
graphic_token --> % 2+ chars
<b>[C1,C2],
{ phrase((graphic_token_char,graphic_token_char), [C1,C2]) },</b>
{ dif([C1,C2], "/*") },
kleene_star(graphic_token_char).
... но безобразно!
Как мне сделать его еще раз (и сохранить его двунаправленным)?