0

文法規則を扱うときに、Prolog で無数の端末を定義することは可能ですか?

次の例は、問題を説明しています。

selection-->([if,'('],condition,[')',
then,'{'],commands,['}']);([if,'('],condition,[')',
then,'{'],commands,['}',else,'{'],commands,['}']).
condition-->[X].
commands-->[X].

ここで、「条件」ブロックと「コマンド」ブロックは、無数の要素を持つことができます。Prologでそれを指定する方法は? ここで提供した条件とコマンドの生成規則では、アトムは 1 つしか許可されません。

次のステートメントが真実であることを望んでいますが、この規則 はcondition-->[X].、これらの括弧の間にアトムを 1 つだけ許可します。

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

付録

プログラムにステートメントから構文ツリーを作成させる方法は? たとえば、次のステートメントを入力したとします。

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

結果は になりますS = selection(if(condition([a,<,b])),then(commands([a,+,+])))

コードにどのような変更を加える必要がありますか?

事前にどうもありがとうございました。

4

1 に答える 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([]) --> [].
于 2012-12-14T06:26:41.987 に答える