У меня есть это правило в файле yacc и отдельный файл C++ для действия правила. Но выход не ожидается, как показано с заявлением для печати ниже .Это правило в parser.y:yacc выводит неожиданные результаты
RecordItem : IdentifierList ':' TypeDenoter
{
char * result = declareRecordItem ($1 , $3);
$$ = result;
printf(" >>> inside RecordItem >> : %s\n",result);
}
;
и это функция «declareRecordItem» в main.cpp файле:
char* declareRecordItem(std::vector<char* >* varList , char* type){
string stm = " ";
string identifier;
for(int i=0 ; i < varList-> size() ; i++)
{
identifier= string((*varList)[i]) ;
symtab[identifier] = string(type);
stm = stm + " " + string(type);
}
char * result = (char*)stm.c_str();
printf(">>> inside declareRecordItem >> : %s\n",result);
return result ;
}
Результат в функции declareRecordItem верен, но когда он возвращается к правилу RecordItem, он ничего не производит, или иногда странные символы печатаются, как показано. Есть идеи !.
>>> inside declareRecordItem >> : i32 i32
>>> inside RecordItem >> :
Если я создаю динамический объект, он будет иметь тип указателя, i.e string * stm = new new std :: string(); , Но как добавить к нему так, как внутри цикла? ». –
'* stm = * stm +" "+ ...' или просто '* stm + =" "+ ...' – rici
Последний вопрос. как я могу преобразовать строку * в char *? –