Добавление ограничения синтаксического анализа в DCG - PullRequest
2 голосов
/ 19 марта 2019

Графические токены могут служить операторами Пролога, которые не требуют одинарных кавычек.

Перевод 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).

... но безобразно! Как мне сделать его еще раз (и сохранить его двунаправленным)?

1 Ответ

3 голосов
/ 19 марта 2019

Я не уверен, что это красивее, но может быть что-то вроде этого:

graphic_token --> kleene_plus_member("#$&*+-.:<=>?@^~\\",0'/).
graphic_token --> "/", kleene_star_member("#$&+-./:<=>?@^~\\", 0'*).

kleene_plus_member(Xs, Code) --> member(Xs), kleene_star(member([Code|Xs])).

kleene_star_member(Xs, Code) --> "" | member(Xs), kleene_star(member([Code|Xs])).

Первое предложение graphic_token анализирует графический токен, который не начинается с /, а второе предложение - тот, который начинается с него.

...