2010-07-04 10 views
2

je voudrais mettre en œuvre un EFM/analyseur « automate pushdown » pour cette syntaxe: parser with scopes and conditionals qui a déjà été « lexed » dans Finite State Machine parserC++ conception EFM et la propriété

Je donne les résultats suivants:

class State 
{ 
public: 
    virtual State* event(const string &token); 
    State* deleteDaughter(); 
private: 
    A* m_parent; 
    A* m_daughter; 
} 
class SomeState : public State 
{ 
public: 
    State* event(const std::string &token); 
} 

Avec Bevent() faisant (après beaucoup de if-elseif) return m_parent->deleteDaughter(). Je sais que c'est poisson (et il se bloque), mais j'ai besoin de façon à retourner le parent State de la fille State et assurez-vous que la fille State n'est pas fui.

Ma boucle d'événement ressemble à ceci:

while(somestringstream >> token) 
    state = state->event(); 

Avant de gronder la conception et le dernier morceau de code, j'ai essayé l'extension d'un exemple beaucoup trop simple de here, ce qui semble assez correct. Je déplace la partie décisionnelle vers les États eux-mêmes, pour plus de clarté et de concision. Je comprends qu'il ya beaucoup de livres sur ce sujet, mais je ne suis pas un informaticien/programmeur et je veux apprendre à le faire moi-même (bien sûr, avec l'aide de tous les gens sympathiques à SO). Si le concept n'est pas clair, veuillez demander. Merci!

Répondre

0

Ne hésitez pas à poster encore votre opinion sur ce sujet, mais j'ai compris comment gérer tout avec grâce:

Première: ma boucle d'événement gardera un pointeur vers la dernière State* créé.

Deuxième: Chaque State a un pointeur vers le parent State, initialisé dans le constructeur, par défaut à 0 (fuite de mémoire si utilisé pour autre chose que le premier State*); cela garantit qu'aucun Etat ne sortira du champ d'application.

Troisième: la fonction State* endOfState() qui fait exactement cela (et je suis particulièrement fier de cette

State* State::endOfState() 
{ 
    State* parent = m_parent; // keep member pointer after suicide 
    delete this; 
    return parent; 
} 

Quand on parle de l'intérieur event() de la sous-classe, il bien se supprimer et renvoyer le pointeur parent. (aller un dans l'échelle)

Si celui-ci contient encore une fuite, s'il vous plaît me faire savoir si la solution est pas claire, s'il vous plaît demander :)

PS:.. pour toute l'équité, l'inspiration a été volé http://www.codeguru.com/forum/showthread.php?t=179284