Я не полностью понятно, почему вы хотите это сделать, но я понимаю, почему то, что у вас есть, не работает. Это потому что "ABCD"
это const char *
, а не std::string
.
Я знаю с Yacc, что первая секция "%{ ... %}"
позволяет вам определять компоненты C вне контроля Yacc (и, похоже, Bison имеет аналогичную функцию, основанную на заявлении о совместимости вверх и документации здесь , 2.1.1). Почему бы вам не поставить:
std::string *strABCD = new std::string("ABCD");
в этом разделе, а затем используйте:
yylval->sval = strABCD;
позже, когда вам понадобится указатель на эту строку?
Мне кажется, это самый простой способ достичь того, чего (я думаю) вы хотите.
Если вы беспокоитесь о том, что выделения внутри синтаксического анализатора Bison не освобождаются (и они должны быть), я советую не делать их там. Вы можете настроить строку перед вызовом yyparse()
, а затем освободить ее после возврата.
Обновление:
Вот как я это сделаю, чтобы избежать выделения / освобождения этого фиксированного значения в синтаксическом анализаторе Bison. Настройте его как глобальный, который живет в течение всей программы.
Основной код:
std::string *strABCD = new std::string ("ABCD");
int main(...) {
// Do some stuff.
: : :
yyparse();
: : :
// Do some other stuff.
}
Источник синтаксического анализатора бизонов:
%{
extern std::string *strABCD;
%}
: : :
yylval->sval = strABCD;
Возвращает фиксированный указатель на строку ABCD с без выделения или освобождения в коде Bison вообще (и очень мало даже в основном коде).