IそのうちYacc
で次のルール私はリンクリストを作成したいを持っている、しかし、私はそれを印刷しようとすると、リスト内の最後のノードを取得しておいてください。Yaccはどのようにこのルールを拡張しますか?
node_list
: {$$=NULL;}
| node_list node {if ($1 != NULL) $1->next=$2; $$=$2; }
;
私の理解では、例えば場合でありますこれは
node_list node3
node_list node2 node3
ndoe_list node1 node2 node3
NULL node1 node2 node3
として、これを拡大するリスト
node1
node2
node3
Yacc
ですが、私はGEをしていますので、
node_list
: {$$=NULL;}
| node_list node {$2->next=$1; $$=$2 ; }
;
私は、それぞれの場合に私はあることを理解:上記のコードで最後のノードをめの設定することは、その後、私の推測では、リストがそのように、私はこのコードを試すリヴィア順
node_list node1
node_list node2 node1
ndoe_list node3 node2 node1
NULL node3 node2 node1
に展開されていることですリストの最後のノードを返すので、1つのノードしか得られないのです。 linkXmlNode
は、今私は最後のノードが3回ごとに繰り返し取得しています
XmlNode * linkXmlNode(XmlNode * first, XmlNode * second)
{
XmlNode * temp = second;
while (second->next != NULL)
second=second->next;
second->next=first;
return temp;
}
ある
node_list
: {$$=NULL;}
| node_list node {$$=linkXmlNode($1,$2);}
;
:だから、私はこのコードを試してみました。私も他の方向を試してみましたが、今私は、最初のノードを取得:誰かがYacc
は素晴らしいことだリストを展開さ方法を正確に知っている場合
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
}
を。
EDIT:ANSWER 私は機能仕事上、私の印刷機能でミスをしていました。エラーは、イテレータを印刷する代わりに、パラメータを印刷しているため、同じノードが複数回取得されていたことです。
これは私にとって 'lex'よりも' yacc'によく似ています。 – geekosaur
修正しました。正しい。 – mihajlv
'$ 1'と' $ 2'を印刷しようとしましたか? –