У меня есть простой конечный автомат (введен ниже). Моя главная проблема заключается в том, что я пытаюсь сделать рекурсивный вызов функции, которая является моим конечным автоматом. После входа в функцию я создаю новый узел для своего дерева и затем проталкиваю его. Когда я делаю рекурсивный вызов, я снова и снова создаю новый узел. Это может сработать, но когда я добавляю детей к родителю, я немного растерялся. Может ли кто-нибудь помочь разобраться в этом и помочь мне взять мой узел дерева (родитель, которого я предполагаю) и привязать к нему ребенка?
TreeNodeClass* ProcessTree(TokenT token, vector <list <stateAssoc> >& vecTree, int depth)
{
int state = 1; //Assume this is a new record.
bool noState = false;
bool update = true;
int dex = 0;
string root, value, data, tag;
TreeNodeClass* treeNode;
treeNode = new TreeNodeClass; //Assume a new node per state machine visit.
//Need 11 to break out of loop as well.
while(state != 10)
{
switch(state)
{
case 1: dex = 1;
break;
case 2: dex = 6;
root = yylval;
break;
case 3: dex = 7;
break;
case 4: dex = 3;
value = yylval;
treeNode->CreateAttrib(root, value);
break;
case 5: dex = 2;
break;
case 6: dex = 4;
data = yylval;
break;
case 7: //Really Don't do anything. Set the tag creation at 8...
dex = 8;
tag = yylval;
if(data != "" and data != "authors")
treeNode->CreateTag(data, tag);
break;
case 8: {
//New TreeNode already grabbed.
//TreeNodeClass* childNode = new TreeNodeClass;
childNode = ProcessTree(token, vecTree, depth+1);
childNode->SetHeight(depth);
treeNode->AddChildren(childNode);
}
token = TokenT(yylex()); //Get a new token to process.
dex = 5;
break;
case 9: dex = 9;
update = false;
if(yylval != treeNode->ReturnTag())
{
state = 11;
}
break;
case 10: update = false;
treeNode->SetHeight(1);
break;
default: cout << "Error " << endl;
cout << state << endl;
cin.get();
break;
}
if(!noState)
state = FindMatch(vecTree[dex], token);
if(update)
token = TokenT(yylex());
else
update = true;
}
return treeNode;
}
Вы можете предположить, что dex — это просто указатель на массив списков, который будет возвращать правильное состояние или 11 (ошибка). Также вы можете предположить, что эта функция по крайней мере однажды была вызвана во входном файле и начала синтаксический анализ. Спасибо за помощь.
Глядя на свой код, у вас есть
int state = 1;
//Code
while(state != 10) {
switch(state) {
case:1 dex = 1; break; //Only case you run
//more cases
case 8: { //never enter here
//New TreeNode already grabbed.
//TreeNodeClass* childNode = new TreeNodeClass;
childNode = ProcessTree(token, vecTree, depth+1);
childNode->SetHeight(depth);
treeNode->AddChildren(childNode); //should work if assuming function is correct
}
//stuff
break;
default: break;//blah
}
}
//blah
return treeNode;
Я не вижу другой причины, кроме факта state
всегда равно 1, что ваш код в случае 8 потерпит неудачу. Это предполагает treeNodeClass::AddChildren(TreeNodeClass*)
был правильно реализован. Без этого кода могу предположить, что это не ваша проблема. Есть ли какой-то метод, в котором state
не будет 1 в коммутаторе?
Других решений пока нет …