Я пытаюсь написать небольшой компилятор, который может разобрать некоторые команды, которые я набираю.Как узнать значение переменной в бизоне при отладке с помощью GDB?
Команда, которую я пытаюсь разобрать это:
create class something = create class do_something ;
Мой код будет выглядеть примерно так:
grammar : my_grammar
{
list<Class1 *> *obj = new list<Class1 *>;
obj->push_back($1);
}
my_grammar : my_definition SEMICOLON
{
report("something detected!");
$$ = $1;
}
my_definition : CREATE CLASS class_name EQU class_expression
{
$5->setClassName(*$3);
$$ = $5;
}
class_expression : CREATE CLASS operand_name
{
$$ = new OperandClass();
$$->setOperationType("createClass");
$$->setOperandName(*$3);
}
Однако, когда я пытаюсь вызвать парсер где-то еще, я не могу получите Class
, который я определил ранее.
Я предполагаю, что в парсере должно быть что-то не так и проделали некоторую отладку с помощью GDB. Но я просто не могу войти в функцию push_back()
, и я не могу правильно напечатать информацию obj
.
Итак, мне интересно, есть ли способ, которым я могу получить значение $$
или $1
при использовании GDB. Просто введите p $$
, чтобы напечатать что-то еще.
Посмотрите на код спагетти, из которого выбивается бизон.Нетрудно определить, какие переменные/структуры представляют собой заполнители $$ и $ 1. bison превращает грамматику в робо-сгенерированный C++, заменяя все элементы yacc-y контейнерами и объектами C++. Как только вы выясните, что это такое, вы будете печатать их содержимое точно так же, как и любые другие объекты ». –
@SamVarshavchik Я просто посмотрю на код спагетти и найду в нем соответствующую строку 'obj-> push_back ($ 1)' в то время как '$ 1' заменяется на' (((yyGLRStackItem const *) yyvsp) [YYFILL ((1) - (1))]. Yystate.yysemantics.yysval.OperandClass) '. Однако, когда я установил точку останова в сгенерированном файле 'cpp' и попытаюсь напечатать значение, программа всегда будет возвращаться к файлу' ypp', который я написал, и говорит: «Без символа YYFILL в текущем контексте». У вас есть идеи об этом? – laxus
Это потому, что YYFILL - это, скорее всего, макрос. –