0

Yaccリンクリストを作成したい次のルールがありますが、印刷しようとするとリストの最後のノードを取得し続けます。

node_list
:                                                   {$$=NULL;}
| node_list node                                    {if ($1 != NULL) $1->next=$2; $$=$2;    }
;

私の理解は、例えばこれがリストであるかどうかです

node1
node2
node3

Yaccこれを次のように拡張します

node_list node3
node_list node2 node3
ndoe_list node1 node2 node3
NULL node1 node2 node3

しかし、上記のコードで最後のノードを取得しているので、リストは敬意を表して展開されていると思います

node_list node1
node_list node2 node1
ndoe_list node3 node2 node1
NULL node3 node2 node1

だから私はこのコードで試してみます:

node_list
:                                                   {$$=NULL;}
| node_list node                                    {$2->next=$1; $$=$2 ;   }
;

いずれの場合も、リストの最後のノードを返すことを理解しています。そのため、ノードを1つだけ取得しています。それで私はこのコードを試しました:

node_list
:                                                   {$$=NULL;}
| node_list node                                    {$$=linkXmlNode($1,$2);}
;

どこにlinkXmlNodeありますか

XmlNode * linkXmlNode(XmlNode * first, XmlNode * second)
{
XmlNode * temp = second;
while (second->next != NULL) 
    second=second->next;

second->next=first; 
return temp;
}

これで、最後のノードが毎回3回繰り返されます。他の方向も試しましたが、最初のノードを取得しました。

XmlNode * linkXmlNode(XmlNode * first, XmlNode * second)
{
if (first == NULL) return second;
XmlNode * temp = first;
while (first->next != NULL)
    first= first->next;
first->next = second;
return temp
}

誰かがYaccリストを正確に拡張する方法を知っているなら、それは素晴らしいことです。


編集:答え 私は私の印刷機能に間違いがありました、上記の機能は動作します。エラーは、イテレータを出力する代わりに、パラメータを出力していたため、同じノードを複数回取得していたことです。

4

2 に答える 2

1
if ($1 != NULL) $1->next=$2; $$=$2;

を返しますが$2、;$2を指していません。あなたは代わりに$1指さし$1ました、しかしあなたは戻ってこないので何もそれについて知ることはありません。(関係について知っているのはそれだけであるということを考えると、どうやって到達する方法を知っているはずの何かが与えられているのですか?)$2$1$2$1$1

$2->next=$1; $$=$2

あなたのリストを取得する必要がありますが、逆の順序です。逆の順序で取得するには、ヘッドポインターとテールポインターの両方を渡すか、リストに追加のルールを挿入してリストを反転してから渡す必要があります。

3回目の試行は、リンクの観点から最も修正に近いものです。同じデータを取得している場合、リスト要素をどのようにコピーしているかという問題が残ります。yaccそれ自体はあなたのリストについて何も知らないことに注意してください。それはリストをまったく「拡張」しません、それはあなたのコードがすることになっていることです。

(あなたの最新のコメントがあなたがあなたの質問を解決したことを示しているかどうかは私にはわかりません。)

于 2012-05-11T20:15:38.057 に答える
0

次の作品を入手できます。

 => nodeList
nodeList node1 => nodeList
nodeList node2 => nodeList
nodeList node3 => nodeList

したがって、最初のケースでは、リストはnullで始まり​​、次にnode1が追加され、次にnode2が追加され、次にnode3が追加されます。ノードをリストの最後にリンクするコードは、最終的なリストを昇順で表示する必要があると言いましたが、編集内容がずっと正しいことを示唆しているのを見たばかりです。

于 2012-05-11T20:18:20.633 に答える