Page 1 sur 2

Analyseur syntaxique

Publié : sam. 01/janv./2005 15:32
par Anonyme2
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

Publié : sam. 01/janv./2005 16:34
par Backup
je crois pas dire de betises (pour une fois :D)

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


:D

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

Publié : sam. 01/janv./2005 16:38
par Anonyme2
J'ai flané sur quelques sites j'ai vu ce principe mais je n'ai pas encore fait du code.

J'avais un bon bouquin sur l'analyse lexicographique mais je n'arrive pas à remettre la main dessus (?)

Sinon toutes les méthodes sont les bien venues :D

Publié : sam. 01/janv./2005 16:50
par Backup
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


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 8)
* -> 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 + - .
:D

Publié : sam. 01/janv./2005 18:14
par Dr. Dri
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

Publié : sam. 01/janv./2005 18:39
par Anonyme2
Merci Dri, interessant le principe de la récursivité pour traiter les priorités :D

Si je comprend bien on élimine les niveaux de priorités les + hauts pour se retrouver avec une expression simple

Publié : sam. 01/janv./2005 20:23
par Le Soldat Inconnu
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 ....

Publié : sam. 01/janv./2005 20:42
par Anonyme2
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 ....
tu peux m'envoyer , merci

Publié : sam. 01/janv./2005 22:01
par Dr. Dri
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 ....
bah en gros c ce ke je fais ^^

Dri

Publié : sam. 01/janv./2005 22:02
par Anonyme2
J'ai déjà réfléchi, ça semble pas trop compliqué dans le principe :idea:

Publié : sam. 01/janv./2005 22:43
par hardy
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.

Publié : dim. 02/janv./2005 12:52
par Anonyme2
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)

Code : Tout sélectionner

 priorité des opérateurs
 ( 
 ) 
 << et >> 
 | et & et ! et ~ et % 
 * et / 
 + et - 
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 ?

Publié : mar. 04/janv./2005 18:26
par Anonyme2
Tiens, je viens de retrouver mon bouquin :D

La programmation par syntaxe, des grammaires à la compilation.
Y'a bien 10 ans que je ne l'ai pas ouvert et je me souviens que c'était hardu surtout au début, plein de choses inconnues.
Je vais me replonger dedans :D

Publié : mar. 04/janv./2005 21:44
par Flype
tu verra c'est passionnant de lancer dans un langage. meme simple.
en cours on avait créer notre propre analyseur d'expression en Python/Objet en respectant scrupuleusement les règles d'art en la matière. c'est parfois indigeste mais quand çà tourne le bonheur.
bon courage denis :twisted:

Publié : mer. 05/janv./2005 17:30
par Anonyme2
Oui Flype, j'ai lu et relu des passages (j'avais mis des annotations au crayon il y a 10 ans sur mon bouquin.

C'est fou ce qu'on peut faire avec ce type d'analyse.

Bon, j'y vais doucement :D