2009-02-27 8 views
3

Je vais d'abord décrire le problème, puis ce que je regarde actuellement, en termes de bibliothèques.parser: l'analyse des formules dans les fichiers modèles

Dans mon application, nous avons un ensemble de variables qui sont toujours disponibles. Par exemple: TOTAL_ITEMS, PRIX, CONTRATS, ETC (nous en avons environ 15). Un client de l'application souhaite que certains calculs soient effectués et affichés, en utilisant ces variables. Jusqu'à présent, j'ai constamment ajouté ces calculs à l'application. C'est la douleur dans le cul, et je voudrais le rendre plus générique en créant un modèle, où l'utilisateur peut spécifier un ensemble de formules que l'application analysera et calculera.

Voici un cas:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS 

Alors, voulez faire quelque chose comme ça pour l'utilisateur de définir dans le fichier de modèle:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS et une méta-jour, comme écran pour l'afficher sur. Par conséquent, ils vont spécifier la formule avec un écran. Et le fichier contiendra de nombreuses formules de cette nature.

En ce moment, je regarde deux libraies: Spirit et matheval

Quelqu'un faire des recommandations ce qui est mieux pour cette tâche, ainsi que des références, des exemples, des liens?

S'il vous plaît laissez-moi savoir si la question n'est pas claire, et je vais essayer de clarifier davantage.

Merci,

Sasha

+0

On dirait que matheval a été écrit dans Euphoria ... est-ce un problème pour votre cas d'utilisation? – joshperry

+0

Quel est le problème avec cela? –

+0

Je suppose que le problème principal est que vous avez besoin d'Euphoria! :-) –

Répondre

0

Si vous avez un nombre fixe de variables, il peut être un peu exagéré d'invoquer un analyseur. Bien que Spirit soit cool et que je veuille l'utiliser dans un projet.

Je probablement tokenizer la chaîne, faire une carte de vos variables calées par nom (en supposant toutes vos variables sont ints):

map<const char*,int*> vars; 
vars["CONTRACTS"] = &contracts; 
... 

Ensuite, utilisez une simple fonction de calcul de Postfix pour faire le calcul réel.

Edit:

En regardant MathEval, il semble faire exactement ce que vous voulez; définir des variables et évaluer les fonctions mathématiques en utilisant ces variables. Je ne sais pas pourquoi vous voudriez créer une solution au niveau d'un analyseur syntaxique. Avez-vous des exigences que MathEval ne remplit pas?

+0

bien, il pourrait être un peu difficile car je dois utiliser de nombreux opérateurs différents (- + * /) - formule peut aller utiliser 30 constantes, certaines pourraient être répétées. –

+0

Les deux bibliothèques remplissent mes exigences, autant que je sache ... la question est l'extensibilité et la complexité de l'utilisation de l'un sur l'autre ... –

0

On dirait qu'il ne devrait pas être trop difficile de générer un analyseur simple à l'aide yacc et bison et l'intégrer dans votre code.

+0

Alors pourquoi ne pas aller pour l'Esprit? Résultats dans moins de dépendances sur des outils externes (je considère Spirit moins externe que yacc et amis) – Anonymous

+0

Dans le contexte de l'esprit vs yacc, alors je serais certainement aller de l'avant. Cependant, je vois aussi que matheval est léger et facile à utiliser pour une grammaire moins compliquée. Merci –

0

Je ne sais pas sur matheval, mais boost :: spirit peut le faire pour vous assez efficacement: voir there.

Si vous êtes en modèle métaprogrammation, vous voudrez peut-être un regard sur Boost::Proto, mais il va prendre un certain temps pour commencer à l'utiliser.

Questions connexes