向DCG添加解析约束

时间:2019-03-19 14:33:36

标签: prolog dcg

图形标记可以用作不需要单引号的Prolog运算符。

ISO / IEC 13211-1:1995,6.4.2“ Syntax.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节“ Syntax.Tokens.Layout文本”添加了以下约束:

  

图形标记不得以字符序列comment open(即“ /*”)开头。

强制实施DCG中的限制没什么...

graphic_token --> graphic_token_char.    % 1  char
graphic_token -->                        % 2+ chars
   [C1,C2],
   { phrase((graphic_token_char,graphic_token_char), [C1,C2]) },
   { dif([C1,C2], "/*") },
   kleene_star(graphic_token_char).

...但是很丑! 如何再次使其漂亮(并保持双向)?

1 个答案:

答案 0 :(得分:3)

我不确定这是否更漂亮,但也许是这样的:

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的第一子句解析不以/开头的图形令牌,第二子句以不以Digikam 5.6.0开头的图形令牌进行解析。