gpt4 book ai didi

c - Yacc 如何扩展这条规则呢?

转载 作者:行者123 更新时间:2023-11-30 15:57:21 25 4
gpt4 key购买 nike

我在 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 ; }
;

我知道在每种情况下我都会返回列表中的最后一个节点,这就是为什么我只得到一个节点。然后我尝试了这段代码:

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 究竟如何扩展列表,那就太好了。

<小时/>

编辑:答案我的打印功能有一个错误,上面的功能可以工作。错误在于,我没有打印迭代器,而是打印参数,从而多次获取相同的节点。

最佳答案

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

返回$2,但$2并未指向$1;您将 $1 指向 $2,但您没有返回 $1,因此没有人会知道它。 (既然只有 $1 知道这种关系,那么只给定 $2 的东西怎么可能知道如何到达 $1 呢?)

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

应该会为您提供列表,但顺序相反。要以其他顺序获取它,您需要传递头指针和尾指针,或者在列表上插入附加规则以在传递列表之前反转列表。

就链接而言,您的第三次尝试最接近正确;如果您获得相同的数据,它留下的问题是如何复制列表元素。请注意,yacc 本身对您的列表一无所知; 根本不会“扩展”列表,这就是您的代码应该做的事情。

(我不清楚您的最新评论是否表明您已经解决了问题。)

关于c - Yacc 如何扩展这条规则呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com