2010-11-18 30 views
3

J'essaie d'écrire un analyseur de condition MSBuild. Les conditions sont décrites here.Écriture d'un simple analyseur de condition MSBuild

Je suis venu avec une grammaire qui semble bien fonctionner:

S -> !S 
S -> S == S 
S -> S != S 
S -> S && S 
S -> S || S 
S -> Fn(str) 
S -> str == str 
S -> str != str 
S -> n < n 
S -> n <= n 
S -> n > n 
S -> n >= n 

Cela semble répondre à mes besoins et je suis venu avec un ensemble de classes C++ qui définissent cette langue simple. c'est-à-dire que je peux créer les classes de telle sorte qu'elles correspondent au-dessus et ensuite je peux appeler "run" sur l'instruction de base et j'obtiens une valeur booléenne à l'autre extrémité.

En utilisant ce langage comme suit:

(!Exists("C:\\config.sys") && 14 < 17) || (AString == AString2 && HasTrailingSlash("C:")) 

devient défini comme (Et pardonnes l'énorme ligne de code;)):

Statement baseStatement(new StatementOrStatement(new StatementAndStatement(new NotStatement(new ExistsFunctionStatement("C:\\Config.sys")), new NumberLessThanNumberStatement(14.0, 17.0)), new StatementAndStatement(new StringEqualStringStatement("AString", "AString2"), new HasTrailingSlashFunctionStatement("C:\\")))); 

je peux simplement exécuter l'instruction ci-dessus comme suit:

const bool result = baseStatement.Run(); 

Donc jusqu'à présent, tout va bien. Il semble que je puisse représenter tout le «langage» en utilisant ma grammaire et je peux construire la grammaire dans une déclaration complète valide.

Cependant maintenant j'ai le prochain problème. Je dois vraiment analyser la chaîne. Je n'ai aucune idée d'où commencer à ce sujet. Quelqu'un peut-il m'aider sur la façon dont j'écris l'analyseur de chaînes pour analyser l'instruction d'origine dans l'ensemble des classes C++ ci-dessus? Je suis plutôt perdu sur ce front. Je le fais uniquement pour mes propres raisons d'apprentissage afin que, dans la mesure du possible, je ne veuille pas utiliser la librairie de l'analyseur de quelqu'un d'autre.

Merci d'avance!

+0

Avez-vous déjà comprendre cela? Je serais intéressé par les résultats. –

Répondre

1
+0

A la vôtre, j'ai étudié un cours de processeurs de langues chez uni .. mais c'était il y a 13 ans ... j'avais oublié les noms de parseurs tels que "Recursive Descent". Cela me donne un endroit où commencer à regarder. Je suis toujours ouvert à plus explicite coups de pied le cul si: D – Goz