终端的无限列表 - Prolog语法规则

问题描述 投票:0回答:1

在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,'}'], []).

附录

如何让程序根据语句建立语法树?例如,如果输入以下语句。

selection( S, [ if, '(', a, <, b, ')', then, '{', a, +, +, '}' ], [] ).,

结果应该是 S = selection(if(condition([a,<,b])),then(commands([a,+,+]))).

我需要对代码做哪些修改?

先谢谢你了。

if-statement prolog context-free-grammar dcg
1个回答
1
投票

使用递归。

condition --> [X], ( condition_separator, condition ; [] ).

condition_separator可能是空的,那么就省略它。

编辑

要生成语法树,最简单的方法是将参数添加到产品中,重现 "形状"(未测试的代码)。

selection(Tree) -->
  [if,'('], condition(Condition1), [')', then,'{'], commands(Commands1), ['}'],
  {Tree = selection(Condition1, Commands1)}
  ;
  [if,'('],condition(Condition1),[')', then,'{'], commands(Commands1),
  ['}', else,'{'], commands(Commands2),['}'],
  {Tree = selection(Condition1, Commands1, Commands2)}
  .

condition(X)-->[X].
commands(X)-->[X].

然后在访问语法树的时候,利用不同的选择数(参数数)来恢复被解析的分支。

比方说,我们有一个命令列表,每个命令都以';'结尾:那可以是

commands([C|Cs]) --> command(C), [';'], commands(Cs).
commands([]) --> [].
© www.soinside.com 2019 - 2024. All rights reserved.