Parsing Prolog DCG中的可选项或重复项

Parsing Prolog DCG中的可选项或重复项,parsing,prolog,dcg,ebnf,Parsing,Prolog,Dcg,Ebnf,因此,我正在用SWI-Prolog编写一个简单的Pascal解析器,使用Definite子句语法 我不明白如何实现重复(2个或更多)或可选地重复(1个或更多)谓词 例如,在EBNF中,Pascal的“程序”是: 其中“标识列表”是: “标识符”是: 我知道在prolog的DCG表单程序中: "PROGRAM" identifier "(" identifierlist ")" ";" block "." program --> ["PROGRAM"], identifier, ["("]

因此,我正在用SWI-Prolog编写一个简单的Pascal解析器,使用Definite子句语法

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

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

其中“标识列表”是:

“标识符”是:

我知道在prolog的DCG表单程序中:

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

如何实现“identifierlist”甚至“identifier”,它包含一个可选的重复数字“identifier”或“letter”或“digit”谓词?

在Prolog中,只要EBNF是您真正想要的,您就可以完全按照EBNF编写它

identifierlist = identifier { "," identifier }
你也可以这样写:

identifierlist = identifier
identifierlist = identifier , identifierlist
identifier_list --> identifier.
identifier_list --> identifier, ",", identifier_list.
在Prolog中,您可以这样写:

identifierlist = identifier
identifierlist = identifier , identifierlist
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\u identifier\u list
的另一种呈现方式是:

nonempty_identifier_list --> identifier, ( [] | ",", nonempty_identifier_list ).

当你说“选择性重复”时,你的意思是它可以是空的吗?您对
identifierlist
的定义似乎没有表明这一点。如果它可能为空,“identifierlist-->[]”应该可以解决这个问题。所以,我不认为我指的是一个空的案例。这与我认为的案例是一样的;然而,我在Prolog方面的经验是如此有限,以至于我无法确定。@MisterCrazy8你已经习惯了。:)一个谓词有多个子句会产生“或”的效果。@MisterCrazy8如果你觉得我的答案可以接受,也许你可以把它标记为接受,或者让我知道我是否还有什么可以澄清的。还有,
nonempty\u identifier\u list-->identifier,([],”,nonempty\u identifier\u list)。
可能是preferabe@false谢谢我不确定。我考虑了其他语法并使用了“显式”视图,但是是的,我可以这样做。