Analyseur syntaxique

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Analyseur syntaxique

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ?? :?
Dernière modification par Backup le sam. 01/janv./2005 16:40, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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 ....
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'ai déjà réfléchi, ça semble pas trop compliqué dans le principe :idea:
hardy
Messages : 333
Inscription : mer. 02/juin/2004 13:19
Localisation : Tours

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Répondre