Boolean et en Mathématiques Analyseur d'Expression
Je suis en train d'écrire une application qui permet à un utilisateur d'entrer une expression booléenne. J'ai besoin de la capacité à évaluer l'expression booléenne à l'exécution et suis à la recherche d'un analyseur et d'un expressoin validateur.
Analyseur
L'analyseur doit prendre une expression booléenne comme une chaîne de caractères et retourne true/false.
Exemple:
expression de chaîne = "(1 == 1) && (1 > 0)"; Analyseur de parser = new Parser(); résultat booléen = parser.parse(expression); //le Résultat doit être Vrai.
En plus de la manipulation des expressions booléennes j'ai aussi besoin de manipuler les Mathématiques.
expression = "((1 + 1 * 2) == 1)"; résultat = parser.parse(expression); //le Résultat doit être Fausse.
Valider
De sorte que je peux indiquer à l'utilisateur si il y a un problème avec l'expression étant entré j'ai aussi besoin d'un moyen de valider la syntaxe.
Je travaille en C# à l'aide de l' .NET Compact Framework, mais si vous savez de quelque chose d'écrit dans une autre langue qui peut être utile.
Merci pour toute aide que vous pouvez fournir.
Tom
OriginalL'auteur Thomas | 2010-02-18
Vous devez vous connecter pour publier un commentaire.
http://www.antlr.org
Antlr grammaires peuvent être conçus pour permettre à la fois l'analyse et de l'évaluation.
Voici un exemple: http://www.antlr.org/wiki/display/ANTLR3/Expression+évaluateur
Par "vous" ci-dessus, je veux dire que Thomas l'OP.
Agriculteur: C'est cibler C# Compact Framework...peut-être un peu lourd pour que...
Je ne sais pas. Avec un relativement simple expression de la grammaire, l'généré analyseur lexical et l'analyseur sera assez faible. Ça vaut le coup, de l'OMI. Il va au moins être facile pour Thomas pour réaliser ce front si ça ne va pas travailler, alors il n'y aura pas trop de temps perdu si elle ne fonctionne pas.
OriginalL'auteur Stephen Caldwell
Notre projet est à l'aide de NCalc (avec ANTLR dessous pour lexing/analyse) et nous sommes très heureux avec elle.
Notre application exige qu'il soit cross-compilé pour à la fois Complet et Compact Cadres. Avec relativement simples réglages, nous avons été en mesure de faire à la fois NCalc et ANTLR pour cadre saveurs.
OriginalL'auteur Jason Morse
En supposant que vous pouvez changer votre syntaxe légèrement, laissez une base de données intégrée de faire le travail pour vous avec une requête de ce T-SQL:
À l'aide de votre exemple:
OriginalL'auteur Austin Salonen
Je ne sais pas du tout bibliothèques pour rendre cela plus facile, mais vous avez vraiment juste deux sous-problèmes ici. Vous avez besoin de construire un infixe à postfix, convertisseur, puis d'écrire une calculatrice de base pour les booléens et des opérations mathématiques.
Une fois que vous avez votre boolean arbre/pile intégrée, de commencer à effectuer des opérations. Si vous avez quelque chose qui n'est pas un numéro, de l'évaluer, par l'envoi d'une chaîne de caractères ou une expression arithmétique calculatrice qui effectue infix->postfix conversion, puis renvoie une valeur.
Si vous google "infixe à postfix" et "pile rpn calculator", vous pouvez probablement trouver plus de ressources.
Je pense que "eval" est tout à fait le mauvais chemin à parcourir. C'est potentiellement facile, mais c'est risqué de laisser les gens écrire du code qui est légal dans votre langue. Il vaut mieux, à mon humble avis, pour avoir une distinct et limité de la grammaire qui est disponible pour ces expressions.
OriginalL'auteur Stefan Kendall
Vous pouvez être en mesure d'utiliser le dotMath bibliothèque pour ce faire.
OriginalL'auteur Tim S. Van Haren
Voici une excellente évaluation de l'analyseur sur Codeproject, qui utilise la méthode eval et ne pas compter sur CodeDOM ou quelque chose comme ça. Voici un excellent article sur la construction d'un évaluateur d'expression à l'aide de Antlr, également sur le même site..
Espère que cette aide,
Meilleures salutations,
Tom.
OriginalL'auteur t0mm13b
Ce genre de chose est F#'s du pain et du beurre. Vous pourriez donner que d'essayer. Pour l'analyse, l'utilisation récursive de la descente, puis vous pouvez exécuter sur l'arbre qui en résulte. Si vous avez le contrôle de la langue de saisie, vous pouvez vous en tirer avec une citation de l'opération.
OriginalL'auteur Joel