C #: Comment analyser des chaînes arbitraires dans des arbres d'expression?

.net c# expression-trees parsing

Question

Dans un projet sur lequel je travaille, je dois travailler avec une source de données plutôt étrange. Je peux lui donner une "requête" et il me retournera un DataTable. Mais la requête n'est pas une chaîne traditionnelle. Cela ressemble plus à ... un ensemble d'appels de méthode qui définissent les critères que je veux. Quelque chose dans ce sens:

var tbl = MySource.GetObject("TheTable");
tbl.AddFilterRow(new FilterRow("Column1", 123, FilterRow.Expression.Equals));
tbl.AddFilterRow(new FilterRow("Column2", 456, FilterRow.Expression.LessThan));
var result = tbl.GetDataTable();

En substance, il prend en charge tous les éléments standard (opérateurs booléens, parenthèses, quelques fonctions, etc.), mais la syntaxe pour l'écrire est assez détaillée et inconfortable pour un usage quotidien.

Je voulais faire un petit analyseur qui analyserait une expression donnée (comme "Column1 = 123 AND Column2 < 456" ) et le convertirais en appels de fonction ci-dessus. De plus, ce serait bien si je pouvais y ajouter des paramètres afin de me protéger des attaques par injection. Le dernier petit morceau de sucre sur le dessus serait s'il pouvait mettre en cache les résultats d'analyse et les réutiliser lorsque la même requête doit être réexécutée sur un autre objet.

Je me demandais donc: existe-t-il des solutions existantes que je pourrais utiliser pour cela, ou devrais-je déployer mon propre analyseur d'expression? Ce n'est pas trop compliqué, mais si je pouvais me réserver deux ou trois jours de codage et une multitude de bugs à corriger, cela en valait la peine.

Réponse acceptée

Essayez l' ironie . Bien que la documentation manque, les exemples vous permettront de démarrer très rapidement. Irony est un projet d'analyse de code et de construction d'arbres de syntaxe abstraite, mais vous devrez peut-être écrire un peu de logique pour créer un formulaire qui répond à vos besoins. Le DLR peut en être le complément, puisqu'il peut générer / exécuter de manière dynamique du code à partir d'arbres de syntaxe abstraite (utilisé pour IronPython et IronRuby). Les deux devraient faire une bonne paire.

Oh, et ce sont deux solutions .NET de première classe et open source.


Réponse populaire

J'ai écrit un analyseur syntaxique pour savoir précisément cet usage et ce niveau de complexité. Cela a pris environ 2 jours. Je suis content de l'avoir fait, mais je ne le referais pas. Je voudrais utiliser Fslex ANTLR ou F #.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi