2010-06-16 17 views
4

Un système a une notation qui nécessiterait l'écriture d'une expression comme (A+B)*C comme #MUL(#ADD(A,B),C). Existe-t-il déjà un algorithme pour effectuer ce type de conversion de notation afin que les utilisateurs puissent entrer de manière plus conventionnelle? En d'autres termes, un algorithme de conversion de l'infixe -> ma notation. Le premier problème est que je ne connais pas le nom exact de ma notation ... c'est similaire au polissage inversé mais pas tout à fait. Chaque opérateur est codé comme une fonction prenant des arguments.Existe-t-il un algorithme pour la conversion/conversion de cette notation?

+2

Je pense que ce qu'on appelle « la notation préfixe », car l'opérateur est au début de la liste des opérandes, plutôt que dans le milieu (infix). – FrustratedWithFormsDesigner

+3

C'est la notation polonaise, nommée d'après Jan Łukasiewicz. C'est similaire à la notation polonaise inverse, juste ... inverse;) –

+2

Il s'appelle les deux. –

Répondre

9

Shunting-yard algorithm peut être utilisé pour analyser la notation de l'infixe.

+0

me battre à elle de 10 sec. – Randy

+0

+1. J'ai rencontré SY, mais ce n'est pas tout à fait la même notation de sortie, donc je me suis demandé si un autre algorithme était plus proche. Est-ce une modification triviale de l'algorithme existant? –

+1

Le shunt peut produire un arbre de syntaxe abstraite. Ayant AST, vous pouvez le parcourir en pré-commande pour obtenir une notation polonaise. –

0

Il est facile d'analyser ces expressions simples en utilisant Lex et Yacc (de Flex et Bison, ils sont identiques). Google pour "calculatrice Yacc".

Un exemple que j'ai trouvé est http://www.indiastudychannel.com/resources/56696-IMPLEMENTATION-OF-CALCULATOR-USING-YACC.aspx mais au lieu de calculer les résultats, vous devriez construire la chaîne finale. Par exemple, comme celui-ci (pseudocode):

expr: ‘(‘expr’)’ 
{ 
$$=$2; 
} 
| 
expr ‘*’expr 
{ 
$$="#MUL(" + S1 + "," + $3 + ")"; 
} 
| 
expr’/’expr 
{ 
$$="#DIV(" + S1 + "," + $3 + ")"; 
} 
+0

Tout va bien, mais je veux mettre cela dans mon code, et même si c'est disponible, je ne veux pas vraiment ajouter une dépendance entière de la bibliothèque pour une chose. –

+0

Lex et Yacc n'ont besoin que de la bibliothèque C standard. Je l'utilise dans mon application pour analyser des fichiers plutôt complexes, et exécuter Lex et Yacc fait partie de mon processus de construction. Dans votre cas, vous pouvez essayer d'exécuter localement Lex et Yacc et utiliser les fichiers .H et .C générés dans votre projet. Après tout, Lex et Yacc traitent simplement votre description de langue et génèrent plutôt des fichiers .H et .C standard. Cela ne devrait pas être un problème pour vous, je pense – Patrick