Соединение нетерминалов для повторного исправления

#bison

#bison

Вопрос:

 idlist  : idlist ',' ID {
                         $$.str=$3.str;
                         $$.ptr=(idtype*)amp;$1;
                        }
        | ID            {
                         $$.str=$1.str;
                         $$.ptr=NULL;
                        }
  

idlist здесь имеет тип idtype . Я новичок в Yaac. Я делаю что-то глупое, потому что мой код перебирает один идентификатор. когда я использую это на один уровень выше.

Итак, здесь грамматика имеет тип после идентификатора. Я мог бы использовать для этого стек, но я подумал, что это мило.

Ответ №1:

Проблема в том, что вы берете адрес $1 , который является локальным временным, существующим только для этого действия правила. Таким образом, после завершения действия оно исчезает, оставаясь $$.ptr висячим и указывая на память, которая будет повторно использована для чего-то другого.