【问题标题】:Adding a parsing constraint to a DCG向 DCG 添加解析约束
【发布时间】:2019-03-20 04:23:14
【问题描述】:

图形标记可以用作不需要单引号的 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 Text”添加以下约束:

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

在 DCG 中执行该限制没什么大不了的......

图形令牌 --> 图形令牌字符。 % 1 个字符 graphics_token --> % 2+ 字符 [C1,C2], { 短语((graphic_token_char,graphic_token_char), [C1,C2]) }, { 差异([C1,C2], "/*") }, kleene_star(graphic_token_char)。

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

【问题讨论】:

  • 丑吗?混合 /* ... */ cmets 和图形令牌的想法很丑。
  • @false。真的。我不希望在图形标记内部或末尾没有 /**/,即使它们是合法的。

标签: prolog dcg


【解决方案1】:

我不确定这是否更漂亮,但可能是这样的:

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

【讨论】:

  • 实际上,当我使用ocamllex 进行 Prolog 分词器时,我也有同样的想法。有点让我觉得我们的工具正在将他们的工作推回给我们;)
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多