Je jette une bouteille à la mer ...
Un fichier DFM est utilisé dans le monde Delphi/ C++ Builder pour la définition des écrans 
Une entête .h, une source .cpp et un DFM crée une unité 
Qui à déjà coder un parser de fichier DFM? Idéalement en C++?
Que penser-vous de ma proposition (*)
Les raisons du pourquoi de ce DFM parser ne sont pas importantes 
Les 2 problèmes: 
- Je n'ai pas trouvé la grammaire d'un fichier DFM
- Il n'y a pas de forcément de délimiteurs. Par exemple:
1 2 3 4 5 6 7 8
| Caption =
#201'videmment, si ceci est votre premi'#232're visite, nous vous inviton' +
's '#224' consulter la FAQ en cliquant sur le lien ci-dessus. Vous dev' +
'rez peut-'#234'tre vous inscrire avant de pouvoir envoyer des message' +
's : cliquez sur le lien d'#39'inscription ci-dessus pour cela. Pour ' +
'commencer '#224' lire les messages, s'#233'lectionnez le forum que vous vo' +
'ulez visiter depuis la liste ci-dessous.'
WordWrap = True |
Et en plus, après réflexion et commencer à en faire un, j'ai l'impression que faire une machine à états directement est une erreur.
Parce que cette machine va devenir assez grosse pour gérer tous le cas. Et donc la maintenance assez pénible à un moment.
Surtout parce que ne connaissant pas la grammaire, il y a toujours un risque de rajouter une correction.
Ce que je pense faire c'est: 
- Découper le fichier en token (algo 1)
- Donner ces token à une machine à états (algo 2)
- Cette machine va utiliser des XXX pour analyser les valeurs, construire un arbre, ...
Et ainsi l'algo 1 et l'algo 2 devraient rester assez petits et ne pas être modifiés dans le temps.
En effet pour la machine le seul point changeant ce sont les valeurs et éventuellement le 'object', 'inherited' (j'ai vu passer un 'inline')
Juste rajouter un XXX.
Mais pour l'algo 1:
1) On ne peut pas découper "bêtement" en fonction des espaces. Exemple:
Header.Font.Name = 'Segoe UI'
2) On ne peut pas découper "bêtement", pour chaque ligne, en fonction ni des : ou ni des =. Exemple (non réel mais possible)
1 2 3
| Caption =
#201'videmment, si ceci est votre premi'#232're visite: nous vous inviton' +
's '#224' consulter la FAQ en cliquant sur le lien ci-dessus (= dev.net). Vous dev' |
Par contre, j'ai remarqué qu'il y avait 4 lignes distinctes 
- ligne 1: <space * - indentation>["object" | "inherit"]<space +>[nom]<space *>':'<space +>[type]<space *>{<space * ou + ???>'['<chiffre? nombre>']'}<EOL>
- ligne 2: <space * - indentation>[key]<space * ou + ???>'='<space * ou + ???>{<space * ou + ???>[value]}<EOL>
- ligne 3: <space * - indentation>[chunk of value]<space * ou + ???><EOL>
- ligne 4: <space * - indentation>"end"<space * ou + ???><EOL>
Et justement je sais découper ces lignes, et aussi quelle action entreprendre 
*) ligne 1, on cherche le ':', et ensuite on découpe les 2 parties avec les <spaces> au centre
Action: créer un nouveau fils
*) ligne 2, on cherche le '='
Action: ajouter une nouvelle propriété et en fonction prendre/ attendre la valeur
*) ligne 3, on ne la découpe pas
Action: prendre ou ignorer la valeur. C'est notre XXX qui décide.
*) ligne 4, on ne la découpe pas
Action: le nouveau fils est fini, on repasse au parent
Et donc ma proposition (*) pour découper mon fichier DFM (algo 1). La machine à états derrière sera triviale si on n’interprète pas les valeurs.
Précondition: un fichier commence toujours par une ligne 1. Est-ce que des lignes vides sont autorisées avant je ne sais pas.
Sur une ligne XXX,
*) Si l'indentation est égale à l'indentation de la ligne précédente/ du bloc courant -> donc on a soit une ligne 1 soit une ligne 2
*) Si l'indentation est supérieure à l'indentation de la ligne précédente/ du bloc courant -> donc on a une ligne 3
On peut renforcer le test: Par défaut, l'indentation est 2 espaces par niveau.
Donc ce serait (indentation + 2) (**)
*) Si l'indentation est inférieure à l'indentation de la ligne précédente/ du bloc courant -> donc on a une ligne 4
On peut renforcer le test: le 'end' est toujours au même niveau que le 'object'/ 'inherit' (**)
** -> mais il faut impérativement des fichiers bien formés. Donc le choix entre un algo strict ou pas.
Partager