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
リストを正確に拡張する方法を知っているなら、それは素晴らしいことです。
編集:答え 私は私の印刷機能に間違いがありました、上記の機能は動作します。エラーは、イテレータを出力する代わりに、パラメータを出力していたため、同じノードを複数回取得していたことです。