Prolog DCG中的可选项或重复项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog DCG中的可选项或重复项相关的知识,希望对你有一定的参考价值。

所以我正在使用Definite Clause Grammars在SWI-Prolog中为Pascal编写一个简单的解析器。

我不明白如何实现重复(2个或更多)或可选地重复(1个或多个)谓词。

例如,在EBNF中,Pascal的“程序”是:

"PROGRAM" identifier "(" identifierlist ")" ";" block "."

其中“identifierlist”是:

identifier { "," identifier }

和“标识符”是:

letter { letter | digit }

我知道prolog的DCG表单程序是:

program --> ["PROGRAM"], identifier, ["("], identifierlist, [")"], [";"], block, ["."].

如何实现“标识符列表”甚至“标识符”,其中包含可选的重复数量的“标识符”或“字母”或“数字”谓词?

答案

在Prolog中,只要EBNF真正符合您的意图,您就可以将其完全写为EBNF。

identifierlist = identifier { "," identifier }

你也可以这样写:

identifierlist = identifier
identifierlist = identifier , identifierlist

在Prolog中,你会把它写成:

identifier_list --> identifier.
identifier_list --> identifier, ",", identifier_list.

如果你想要包含一个空的标识符列表,那么它会更精细:

identifier_list --> [].
identifier_list --> nonempty_identifier_list.

nonempty_identifier_list--> identifier.
nonempty_identifier_list--> identifier, ",", nonempty_identifier_list.

您的原始EBNF不包含空的标识列表。如果是这样,上面的代码可能看起来很像EBNF。


As @false points out in the comments, another rendering of nonempty_identifier_list is:
nonempty_identifier_list --> identifier, ( [] | ",", nonempty_identifier_list ).

以上是关于Prolog DCG中的可选项或重复项的主要内容,如果未能解决你的问题,请参考以下文章

通过 DCG 在 Prolog 中的镜头,可能与否?

Prolog DCG从字母数字字符构建/识别单词串

如何在DCG之后从知识库中生成一些短语?

Prolog DCG 使用 separotr 从文件中读取

如何在没有 DCG 的 L 系统启发的重写系统中进行递归

像 Prolog 一样统一数据框列以删除重复项