If statement 终端的无限列表–;序言语法规则

If statement 终端的无限列表–;序言语法规则,if-statement,prolog,context-free-grammar,dcg,If Statement,Prolog,Context Free Grammar,Dcg,在处理语法规则时,是否可以在Prolog中定义不确定数量的终端 以下示例描述了该问题: selection-->([if,'('],condition,[')', then,'{'],commands,['}']);([if,'('],condition,[')', then,'{'],commands,['}',else,'{'],commands,['}']). condition-->[X]. commands-->[X]. 在这里,“条件”和“命令”块可以有无限个元素

在处理语法规则时,是否可以在Prolog中定义不确定数量的终端

以下示例描述了该问题:

selection-->([if,'('],condition,[')',
then,'{'],commands,['}']);([if,'('],condition,[')',
then,'{'],commands,['}',else,'{'],commands,['}']).
condition-->[X].
commands-->[X].
在这里,“条件”和“命令”块可以有无限个元素。如何在Prolog中指定它?我在这里提供的条件和命令的产生式规则只允许一个原子

我希望下面的陈述是真实的,但是这条规则,
condition-->[X]。
,在这些括号之间只允许一个原子:

selection([if,'(',a,<,b,')',then,'{',a,+,+,'}',else,'{',c,'}'], []).
选择([if',(',a,使用递归:

condition --> [X], ( condition_separator, condition ; [] ).
条件_分隔符可以为空,然后忽略它

编辑

要生成语法树,最简单的方法是向产品中添加参数,复制“形状”(未测试的代码):

然后,在访问树时,使用不同的选择算术(参数计数)来恢复已解析的分支

假设我们有一个命令列表,其中每个命令都以“;”结尾:这可能是

commands([C|Cs]) --> command(C), [';'], commands(Cs).
commands([]) --> [].

谢谢,这很有帮助,但我遇到了另一个问题。请参阅下面的“附录”中我的编辑。
commands([C|Cs]) --> command(C), [';'], commands(Cs).
commands([]) --> [].