gpt4 book ai didi

parsing - Prolog DCG 中的可选或重复项

转载 作者:行者123 更新时间:2023-12-04 16:05:12 28 4
gpt4 key购买 nike

所以我正在使用 Definite Clause Grammars 在 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 ).

关于parsing - Prolog DCG 中的可选或重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075855/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com