Prolog DCG中的可选或重复项目



所以我正在使用定子句语法在SWI-Prolog中为Pascal编写一个简单的解析器。

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

例如,在EBNF中,对于Pascal的"程序"是:

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

其中"标识符列表"是:

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。


正如@false在评论中指出的那样,nonempty_identifier_list的另一种呈现方式是:
nonempty_identifier_list --> identifier, ( [] | ",", nonempty_identifier_list ).

最新更新