2009-10-22 23 views
2

Ma tâche est d'écrire une application (malheureusement sur C) qui lit l'expression en notation infixée (avec variables, opérateurs unaires et binaires) et de la stocker en mémoire, puis de l'évaluer. En outre, les contrôles d'exactitude doivent être effectués.Expressions d'écriture: Infix, Postfix et Préfixe

par exemple:

3 * (A + B) - (- 2-78) * 2 + (0 * A)

Après avoir obtenu toutes les valeurs, le programme devrait calculer il.

La question est: Quelle est la meilleure façon de le faire (avec optimisation et validation)

Quelle notation à choix que la base de l'arbre?

Devrais-je représenter l'expression comme un arbre? Si c'est le cas, je peux facilement l'optimiser (il suffit de laisser tomber les nœuds qui renvoient 0 ou rien d'autre).

Cheers,

+2

D'excellentes réponses à cette question peuvent être trouvées dans: http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence –

+3

Je ne sais pas pourquoi c'est dommage d'écrire en C. Je préfère aimer cette langue. – mrduclaw

+1

Question de compilateurs/interprètes autoritaires: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler – dmckee

Répondre

2

Le lien proposé dans le commentaire par Greg Hewgill ci-dessus contient toutes les informations dont vous aurez besoin:

Si vous insistez pour écrire votre propre,

  • un recursive descent parser est probablement la façon la plus simple à la main.
  • Sinon, vous pouvez utiliser un outil comme Bison (puisque vous travaillez en C). This tutorial est le meilleur que je l'ai vu pour travailler avec Flex et Bison (ou Lex/Yacc)

Vous pouvez également rechercher des "expression evaluator" sur CodeProject - ils ont beaucoup d'articles sur le sujet.

Je suis tombé sur l'évaluateur d'expression du programme M4 il y a quelque temps. Vous pouvez étudier son code pour voir comment cela fonctionne. Je pense que this link sur Google Codesearch est la version que j'ai vu.

0

Vos conseils de question à des exigences mis sur votre solution:

sur C unfortunatly

donc quelques suggestions ici pourraient ne pas être admissible. Néanmoins, je suggérerais que c'est un problème assez compliqué à résoudre, et que vous auriez intérêt à essayer de trouver une bibliothèque existante appropriée que vous pourriez lier dans votre code C pour le faire pour vous. Cela réduirait probablement le temps et les efforts nécessaires pour faire fonctionner le code et réduirait les efforts de maintenance en cours. Bien sûr, vous devriez penser à la licence, mais je serais surpris s'il n'y avait pas une bonne bibliothèque d'analyse syntaxique "là-bas" qui pourrait faire un bon travail de cela.