La Machine à État fini analyseur

Je voudrais analyser une auto-conçu format de fichier avec un FSM-comme analyseur en C++ (c'est un teach-myself-c++-the-hard-way-by-doing-something-big-and-difficult type de projet :)). J'ai un segmentées en chaîne avec des retours à la ligne signifiant la fin d'un euh... ligne. Voir ici pour un exemple d'entrée. Tous les commentaires et d'ordure, est filtré, j'ai donc un std::string comme ceci:

global \n { \n SOURCE_DIRS src \n HEADER_DIRS include \n SOURCES bitwise.c framing.c \n HEADERS ogg/os_types.h ogg/ogg.h \n } \n ...

Explication de syntaxe:

  • { } sont étendues, et les mots avec des majuscules signifient que la liste des options/fichiers est à suivre.
  • \n seulement important dans une liste d'options/fichiers, signifiant la fin de la liste.

J'ai donc pensé que le FSM serait simple/suffisamment extensible pour mes besoins/connaissances. Aussi loin que je peux (et veux que mon fichier de conception de l'être), je n'ai pas besoin simultanées états ou quelque chose de compliqué comme ça. Certains de la conception/mise en œuvre des questions:

  1. Dois-je utiliser un enum ou d'un résumé class + dérivés pour mes états? Le premier est probablement mieux pour les petites syntaxe, mais pourrait devenir laid plus tard, et la deuxième est l'exact opposé. Je penche pour la première, pour sa simplicité. enum exemple et exemple de classe. EDIT: ce sujet cette suggestion pour goto, je pensais qu'ils étaient mal en C++?
  2. Lors de la lecture d'une liste, j'ai besoin de ne PAS ignorer \n. Ma façon préférée de l'aide de l' string via stringstream, va ignorer \n par défaut. J'ai donc besoin de façon de dire (la même!) stringstream de ne pas ignorer les retours à la ligne lorsqu'un certain état est activé.
  3. Va de la simple enum états suffire pour le multi-niveau de l'analyse (étendues au sein des étendues {...{...}...}) ou qui ont besoin de hacky implémentations?
  4. Voici le projet d'états que j'ai en tête:
    • upper: lit mondiale, exe, lib+ noms de cible...
    • normal: à l'intérieur d'un champ d'application capable de lire les SOURCES..., de créer des variables utilisateur...
    • list: ajoute des éléments à une liste jusqu'à ce qu'un saut de ligne est rencontré.

Chaque application aura une sorte de conditionnelle (par exemple, win32:global { gcc:CFLAGS = ... }) et devront être traitées exactement de la même manière de tous les cotés (même dans le list de l'état, élément par élément).

Merci pour toute entrée.

Flying Spaghetti Monster?
La Machine À État Fini.
LOL, édité à préciser.
goto est pas mal. Abusé goto est le mal. Utilisé correctement goto peut rendre le code plus facile à lire et à suivre, et l'un de l'utilisation correcte des cas, je sais de pour eux, c'est exactement dans le codage Smqs. Pourquoi tant insister sur goto être le mal? Religion.
Le problème c'est que l'abus crée des monstres indéchiffrable.

OriginalL'auteur rubenvb | 2010-06-21