Analyseur syntaxique
Analyseur syntaxique
J'ai besoin d'aide et là je pense d'abord à ceux qui sont de formation informatique.
J'ai pas besoin d'un code tout prêt, j'ai plutôt besoin de comprendre le principe.
J'ai écrit une petit analyseur pour des expressions simples du type addition, soustractions de nombres decimaux, et hexa.
J'aimerais faire une analyse d'une expression complète avec proirité des opérateurs (même priorité que les opérateurs purebasic)
*
/
<<
>>
+
-
(
)
=
|
&
!
~
%
Merci d'avance
J'ai pas besoin d'un code tout prêt, j'ai plutôt besoin de comprendre le principe.
J'ai écrit une petit analyseur pour des expressions simples du type addition, soustractions de nombres decimaux, et hexa.
J'aimerais faire une analyse d'une expression complète avec proirité des opérateurs (même priorité que les opérateurs purebasic)
*
/
<<
>>
+
-
(
)
=
|
&
!
~
%
Merci d'avance
je crois pas dire de betises (pour une fois
)
en FORTH on elimine le probleme de priorité , les createur ont utilisé
la notation polonaise inverse
1+2+(5*4)= 23
analyse facon Forth
1 2 +
empile 1 , empile2
additionne
empile sur pileresultat-> 3
5 4 *
empile 5
empile 4
multiplie
empile sur pileresultat-> 20
additione (les 2 resultat empilé !! )
pile resultat=23

c'est peut etre une idée a suivre ??

en FORTH on elimine le probleme de priorité , les createur ont utilisé
la notation polonaise inverse
1+2+(5*4)= 23
analyse facon Forth
1 2 +
empile 1 , empile2
additionne
empile sur pileresultat-> 3
5 4 *
empile 5
empile 4
multiplie
empile sur pileresultat-> 20
additione (les 2 resultat empilé !! )
pile resultat=23

c'est peut etre une idée a suivre ??

Dernière modification par Backup le sam. 01/janv./2005 16:40, modifié 1 fois.
D'ailleurs
l'avantage du pure c'est qu'une liste se comporte comme une pile en assembleur
donc on peut creer une "pile" pour les commandes
" / * - + = ( ) ect ... ou plus evolué genre "double" (mult par 2 )
une autre pour les chiffres reservé au calculs
une autre pour les resultats , ect....
avec les fonctions de recherche "in the texte" qui existe , il pourrait etre tres facile de faire un language nouveau
ou refaire un Forth comme cela a ete fait sur Atari ST MAG 121
extrait a propos du Forth et des priorités

l'avantage du pure c'est qu'une liste se comporte comme une pile en assembleur
donc on peut creer une "pile" pour les commandes
" / * - + = ( ) ect ... ou plus evolué genre "double" (mult par 2 )
une autre pour les chiffres reservé au calculs
une autre pour les resultats , ect....
avec les fonctions de recherche "in the texte" qui existe , il pourrait etre tres facile de faire un language nouveau
ou refaire un Forth comme cela a ete fait sur Atari ST MAG 121
extrait a propos du Forth et des priorités
Tout tourne autour d'une pile de donn‚es. Ceux qui ont eu une
calculatrice HP savent de quoi je parle. L'interpr‚teur ne fait que lire
les lignes de commande:
- tout nouveau nombre rencontr‚ est simplement d‚pos‚ sur le
sommet de la pile
- tout autre mot est une instruction qui va modifier le contenu de
cette pile
Par exemple, le mot '+' retire les deux nombres du sommet de la
pile et y d‚pose en retour leur somme. Donc pour calculer et afficher la
somme 13+45, je tape en FORTH:
13 45 + . [Return]
D‚taillons:
13 -> d‚pos‚ sur la pile (13)
45 -> d‚pos‚ sur la pile (13 45)
+ -> prend 45 et 13 et d‚pose 45+13=58 … la place (58)
. -> prend 58 et l'affiche (le '.' sert de PRINT pour les
nombres)
Autre exemple: (2+3)*8-(7+5), il suffit de taper:
2 3 + 8 * 7 5 + - . [Return]
D‚taillons:
2 -> d‚pos‚ (2)
3 -> d‚pos‚ (2 3)
+ -> calcul (5)
8 -> d‚pos‚ (5
* -> calcul (40)
7 -> d‚pos‚ (40 7)
5 -> d‚pos‚ (40 7 5)
+ -> calcul (40 12)
- -> calcul (28)
. -> affichage de la valeur 28 ()
Essayez vous-mˆmes cette autre s‚quence pas … pas et vous verrez
qu'on arrive au mˆme r‚sulat: 8 2 3 + * 7 5 + - .

C'est le meme principe ke les calculettes HP ca, pas évident !!
Sinon j'avais fait un vieux (ancien) code (en DB) qui en fait travaillait de facon récursive...
la fonction recoit une chaine...
elle renvoi une chaine pour le résultat...
elle cherche le plus haut niveau de priorité : les parentheses
elle s'appelle elle meme pou évaluer les parentheses...
Ce qui fait q'elle seront remplacées par le résultat (et n fois réévaluée si y'a encore des parentheses....)
Apres je gere les opérations de gauche à droite (quand y'a plus de parenheses) par niveau de priorité... Jusqu'à ne plus avoir d'opérateur...
En espérant t'aider...
Dri
Sinon j'avais fait un vieux (ancien) code (en DB) qui en fait travaillait de facon récursive...
la fonction recoit une chaine...
elle renvoi une chaine pour le résultat...
elle cherche le plus haut niveau de priorité : les parentheses
elle s'appelle elle meme pou évaluer les parentheses...
Ce qui fait q'elle seront remplacées par le résultat (et n fois réévaluée si y'a encore des parentheses....)
Apres je gere les opérations de gauche à droite (quand y'a plus de parenheses) par niveau de priorité... Jusqu'à ne plus avoir d'opérateur...
En espérant t'aider...
Dri
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
si tu veux, je te file le code de ma calculette. c'est ce principe :
en gros, j'ai une procedure de calcul des * / + -
quand je tombe sur une parenthèse, je relance la procedure en récursif sur le contenu de la parenthèse
puis pour les priorités, je gère comme ça (exemple avec les */+-) :
d'abord les * et / ur le même niveau, je lit toute l'opération et fait tout les calcul de multiplication.
donc je n'ai plus de * et /
et on refait parail pour les +- qui sont également sur le même niveaux de priorité
etc ....
en gros, j'ai une procedure de calcul des * / + -
quand je tombe sur une parenthèse, je relance la procedure en récursif sur le contenu de la parenthèse
puis pour les priorités, je gère comme ça (exemple avec les */+-) :
d'abord les * et / ur le même niveau, je lit toute l'opération et fait tout les calcul de multiplication.
donc je n'ai plus de * et /
et on refait parail pour les +- qui sont également sur le même niveaux de priorité
etc ....
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
tu peux m'envoyer , merciLe Soldat Inconnu a écrit :si tu veux, je te file le code de ma calculette. c'est ce principe :
en gros, j'ai une procedure de calcul des * / + -
quand je tombe sur une parenthèse, je relance la procedure en récursif sur le contenu de la parenthèse
puis pour les priorités, je gère comme ça (exemple avec les */+-) :
d'abord les * et / ur le même niveau, je lit toute l'opération et fait tout les calcul de multiplication.
donc je n'ai plus de * et /
et on refait parail pour les +- qui sont également sur le même niveaux de priorité
etc ....
bah en gros c ce ke je fais ^^Le Soldat Inconnu a écrit :si tu veux, je te file le code de ma calculette. c'est ce principe :
en gros, j'ai une procedure de calcul des * / + -
quand je tombe sur une parenthèse, je relance la procedure en récursif sur le contenu de la parenthèse
puis pour les priorités, je gère comme ça (exemple avec les */+-) :
d'abord les * et / ur le même niveau, je lit toute l'opération et fait tout les calcul de multiplication.
donc je n'ai plus de * et /
et on refait parail pour les +- qui sont également sur le même niveaux de priorité
etc ....
Dri
J'ai déjà fait programmer à mes étudiants (avec évaluation de la cohérence syntaxique) : récursif. Via un compteur de parenthèses, on cherche l'opérateur "en dehors" du système de parenthèses de plus haute priorité, on coupe en deux, et appels récursifs.
S'il y en a pas, deux trois autres cas à examiner.
Je code ça quand j'ai le temps.
S'il y en a pas, deux trois autres cas à examiner.
Je code ça quand j'ai le temps.
Merci Hardy
je commence à écrire un truc
Fred décompresse pendant quelques jours, alors en attendant j'aimerais avoir votre avis
Voici comment je vois les niveaux de priorités des opérateurs (pas pour les expressions logiques mais de calcul)
tous les opérateurs sur la même ligne (voir ci-*dessus) ont le même niveau de priorité, les parenthèses le plus haut niveau puis les rotations << et >> etc.
Vous avez compris la chose comme moi ?
je commence à écrire un truc
Fred décompresse pendant quelques jours, alors en attendant j'aimerais avoir votre avis
Voici comment je vois les niveaux de priorités des opérateurs (pas pour les expressions logiques mais de calcul)
Code : Tout sélectionner
priorité des opérateurs
(
)
<< et >>
| et & et ! et ~ et %
* et /
+ et -
Vous avez compris la chose comme moi ?