stocker des numéros de ligne des expressions avec boost.spirit 2
-
22-09-2019 - |
Question
Je prévois faire un utilitaire de transformation de script (pour des informations de diagnostic étendu) en utilisant Boost.Spirit 2.
Bien qu'il y ait un soutien pour etc. d'information en ligne pour erreurs d'analyse syntaxique, comment je peux stocker les numéros de ligne pour les expressions avec succès Qi analysables?
La solution
Selon la liste de diffusion, Spirit.Classic noreferrer itérateurs de position peut également être utilisé avec Spirit 2 .
Il y a aussi un article sur un iter_pos-analyseur sur Esprit -Blog.
Je mettrai à jour quand j'eu le temps de tester.
Autres conseils
Je me rends compte que je remarquai la question en retard, mais permettez-moi d'ajouter ceci de toute façon. J'ai écrit un échantillon d'un analyseur de fichier INI dans une autre réponse:
Il utilise une action sémantique 'simple' avec line_pos_iterator
.
Voici le fruit de mon travail: https://gist.github.com/1425972
- Lorsque
POSITIONINFO == 0
- entrée est en streaming
- sortie est cordes brutes (bien, pour les sections
map<string, map<string, string> >
)
-
Quand
POSITIONINFO == 1
- entrée est tamponnée
-
sortie est
textnode_t
:struct textnode_t { int sline, eline, scol, ecol; string_t text; };
Cela signifie que le
map<textnode_t, map<textnode_t, textnode_t> >
résultant est capable de rapporter exactement ce que (ligne, colonne) points de début et de fin marquent les nœuds de texte individuels.
Voici une démo réduite. Pour une description complète et vaste des cas de test voir Anser originale ou le code github
Démo entrée
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
Demo sortie (POSITIONINFO == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
Sortie de démonstration (POSITIONINFO == 1)
Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]