9
votes

Boolean and Math Expression Parser

J'écris une application permettant à un utilisateur d'entrer une expression booléenne. J'ai besoin de la capacité d'évaluer l'expression booléenne entrée à l'heure d'exécution et à la recherche d'un analyseur et d'un validateur expressé.

anal fort>
L'analyseur doit adopter une expression booléenne comme une chaîne et retourne vrai / faux. P>

Exemple: P>

expression = "((1 + 1 * 2) == 1)";
result = parser.parse(expression);  // Result should be False.


0 commentaires

7 Réponses :


0
votes

Je ne connais pas de bibliothèques pour faciliter cela, mais vous avez vraiment deux sous-périllons ici. Vous devez construire un convertisseur Infix to Postfix, puis écrivez une calculatrice de base pour les opérations Boolean et Math.

Une fois que votre arbre booléen / pile construit, commencez à effectuer des opérations. Si vous avez quelque chose qui n'est pas un nombre, évaluez-le en envoyant la chaîne / expression à la calculatrice arithmétique qui effectue une conversion d'infixe> postfix, puis renvoie une valeur.

Si vous Google "Infix to Postfix" et "Calculatrice de pile RPN", vous pouvez probablement trouver plus de ressources.


2 commentaires

Si vous pouvez enregistrer une langue à une langue avec "eval", cependant, le problème est résolu. Vous recherchez un vrai ou faux, et pour tout le reste, vous savez que vous êtes invalide.


Je pense que "eval" est entièrement la mauvaise façon de partir. C'est potentiellement facile, mais c'est risqué laissant que les gens écrivent n'importe quel code qui est légal dans votre langue. C'est mieux, IMHO, d'avoir une grammaire distincte et limitée disponible pour ces expressions.



0
votes

Vous pourrez peut-être utiliser le Bibliothèque Dotmath pour le faire.


0 commentaires

3
votes

http://www.antlr.org

Les grammaires anti-anti-antlr peuvent être conçues pour permettre l'analyse et l'évaluation.

Voici un exemple: http://www.antlr.org/wiki / Affichage / Antlr3 / Expression + Évaluateur


4 commentaires

+1 pour Antlr. Si vous regardez cela et que vous le rejoignez, pensez que ceci est trop tracas, veuillez reconsidérer. Je vous recommande d'utiliser des antlrworks en tant qu'outil de développement de la grammaire et de lui donner des classes Lexer and Parser dans votre arborescence de projet Visual Studio. C'est relativement transparent et il est facile de modifier de manière itérale votre grammaire et de voir rapidement ses effets dans votre monde .Net.


Par "vous" ci-dessus, je veux dire Thomas l'op.


@Chris Farmer: Ceci est ciblant C # Cadre Compact ... pourrait être un peu lourd pour ça ...


Je ne sais pas. Avec une grammaire d'expression relativement simple, le lexer et l'analyseur généré seront assez petits. Ça vaut la peine d'être coupé, imo. Cela sera au moins facile pour Thomas de réaliser ce devant si cela ne fonctionnera pas, il n'ya donc pas trop de temps perdu si cela ne marche pas.



0
votes

Voici un excellent analyseur d'évaluation sur codeProject , qui utilise la méthode eval et ne repose pas sur la code ou quoi que ce soit comme ça. Voici un excellent article sur la construction d'un Evaluateur d'expression en utilisant ANTLR, également sur le même site ..

J'espère que cela aide, Meilleures salutations, Tom.


0 commentaires

0
votes

Ce type de chose est le pain et le beurre de F #. Vous pourriez donner cela un essai. Pour analyser, utilisez une descente récursive, vous pouvez ensuite exécuter l'arbre qui donne des résultats. Si vous avez le contrôle de la langue d'entrée, vous pouvez vous procurer avec une opération de devis.


0 commentaires

2
votes

En supposant que vous puissiez modifier légèrement votre syntaxe, laissez une base de données intégrée faire le travail pour vous avec une requête comme celle-ci T-SQL: xxx pré>

à l'aide de votre exemple: P>

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result


1 commentaires

Selon la question, l'expression est effectivement entrée par l'utilisateur. Ainsi, votre solution est sujette à l'injection SQL.



6
votes

Notre projet utilise NCALC (avec antlr sous la lexing / analyse) et nous en sommes très heureux.

NCALC est une expressions mathématiques Évaluateur dans .NET. Ncalc peut analyser tout expression et évaluer le résultat, y compris les paramètres statiques ou dynamiques et fonctions personnalisées.

Notre application nécessite qu'elle soit compilée contre les cadres compacts et compacts. Avec des modifications relativement simples, nous avons pu faire des travaux NCALC et ANTLR pour les deux saveurs de cadre.


0 commentaires