Analyseur pour arbre d'expression de filtre de requête

c# expression-trees parsing tsql

Question

Je cherche un analyseur pouvant fonctionner sur un filtre de requête. Cependant, je ne suis pas tout à fait sûr de la terminologie, donc cela s'avère être un travail difficile. J'espère que quelqu'un pourra m'aider. J'ai lu des articles sur les «analyseurs de descente récursive», mais je me demande s'ils sont destinés à des analyseurs syntaxiques complets plutôt qu'à l'évaluation de l'expression logique que je recherche.

Idéalement, je recherche du code .NET (C #) mais aussi un analyseur similaire qui fonctionne en T-SQL.

Ce que je veux, c'est que quelque chose soit analysé, par exemple:

((a = b) | (e = 1)) & (c <= d)

Idéalement, les opérateurs peuvent être définissables (par exemple '<' vs 'lt', '=' vs '==' vs 'eq', etc.) et nous pouvons spécifier des étiquettes de type de fonction (par exemple (left (x, 1) = 'e')). L'analyseur charge ceci, obéit à la priorité de l'ordre (et gère idéalement l'absence de crochets), puis rappelle-mon code avec des expressions à évaluer en résultat booléen - par exemple 'a = b'?). Je ne m'attendrais pas à ce que l'analyseur comprenne les fonctions personnalisées de l'expression (bien que certaines fonctions de base soient utiles, comme le fractionnement de chaîne). Découper l'expression (en parties gauche et droite) serait bien.

Il est préférable que l’analyseur demande le nombre minimum de questions nécessaires pour déterminer le résultat final - par exemple, si l’un des côtés d’un AND est faux, il est inutile d’évaluer l’autre côté et d’évaluer d’abord le côté le plus facile (c.-à-d. l'expression ci-dessus, 'c <= d', devrait être supposée être plus rapide et donc évaluée en premier.

J'imagine que c'est beaucoup de travail à faire, cependant, assez commun. Quelqu'un peut-il me donner des indications? Si les analyseurs syntaxiques ne sont pas aussi flexibles que ci-dessus, puis-je utiliser des analyseurs syntaxiques de base?

Merci beaucoup

Lee

Réponse populaire

Vous pouvez vérifier Irony . Avec cela, vous définissez votre grammaire en code C # en utilisant une syntaxe qui n’est pas très éloignée de BNF. Ils ont même un exemple simple sur leur site (évaluateur d’expression) qui semble être assez proche de ce que vous souhaitez atteindre.

Edit: Il a été question de Irony lors du symposium Lang.Net de cette année.

J'espère que cela t'aides!




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