Objekte verlieren Inhalt
-
Hi,
ich bin dabei einen Parser zu schreiben. Die Eingabe wird von einem Scanner aufgenommen was auch funktioniert. Der Parser ließt die Tokens vom Scanner, überprüft ob der Syntax korrekt ist und baut einen Parse Baum auf. Beim aufstellen des Baums werden die nötigen Werte die bei der Evaluation gebraucht werden eingetragen, wurde auch im Debugger überprüft. Bei der Evaluation wenn ich die Werte auslesen will sind sie weg.ein Beispiel aus dem Parser
void statement(Node* node){ Node* newNode = node->addNode(3); if(firstStatement(tPtr)){ if(tPtr->getTType() == typeIdentifier){ // falls erstens zeichen ein Identifier ist newNode->addLeaf(tPtr); if((tPtr = getNextToken())->getTType() == typeOpAsign){ // falls zutrifft identifier := , dann exp() tPtr = getNextToken(); exp(newNode); } else { error();} // falls nach ident. nicht := kommt=> fehler } else if(tPtr->getTType() == typeOpPrint){ // falls statement mit print beginnt... newNode->addLeaf(tPtr); if((tPtr = getNextToken())->getTType() == typeOpOpenBracket){ //... dann muss auch "(" folgen tPtr = getNextToken(); // dann nach exp aufloesen.. exp(newNode); if(tPtr->getTType() == typeOpClosedBracket){ // auf exp muss ")" folgen tPtr = getNextToken(); return; } else { error(); } // falls nicht ")" auf exp folgt => error } else { error(); }// falls auf print keine "(" folgt => error } } }
Es gibt die Klassen Node und Leaf die von der Klasse ParseTreeElement erben. Hier ein Ausschnitt von node
class Node : public ParseTreeElement { private: int type; // Typ des Knotens 1 = statementlist 2 = statemenlist2 3 = statement 4 = exp 5 = exp2 6 = op_exp //7 = explist 8 = explist2 9 = op int elementCount; // Anzahl der Knoten und Blätter die an diesem Knoten hängen static ParseTreeElement** elements; // Knoten und Blätter die an diesem Knoten hängen public: Node(int nType) //Parameter Typ des Knotens zB statementlist { type = nType; elementCount = 5; elements = new ParseTreeElement*[elementCount]; for (int i = 0; i < elementCount; i++) { elements[i] = NULL; } } Node* addNode(int type) { for (int i = 0; i < elementCount; i++) { if (elements[i] == NULL) { elements[i] = new Node(type); return (Node*)elements[i]; } } return NULL; }
Wenn ich dann den Baum evaluieren will gibt es eine Speicherzugriffsverletzung. Ich kann auch noch mehr Code posten bei Bedarf.
-
Ich habe schon lange nicht mit Arrays gearbeitet, aber die Zeile
elements = new ParseTreeElement*[elementCount];
kommt mir komisch vor - besonders der "*" -> ich denke, der gehört hier nicht hin.
Außerdem frage ich mich, warum elements ein Pointer-pointer ist - würde nicht auch ein normaler Pointer reichen? Und wenn es ein Pointer-Pointer ist, müsste dann bei der Zeile oben nicht "*elements =" stehen?
static ParseTreeElement** elements; // Knoten und Blätter die an diesem Knoten hängen
Wenn ich mich irre, würdest Du somit ein Array mit der falschen Grösse anlegen und dann falsch darauf zugreifen.