CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Analyse syntaxique

sn00bino
sn00bino
Niveau 5
29 octobre 2007 à 22:33:41

lu,
J´ aimerais avoir des précisions sur l´ analyse syntaxique, sachant que j´ utilise un arbre syntaxique abstrait.

++

dnob700
dnob700
Niveau 10
29 octobre 2007 à 23:21:57

c´est un peu vague (vaste) comme question.

Tu veux savoir comment implémenter un analyseur syntaxique pour construire ton AST ? si c´est ça, tu veux le faire à la main ? en utilisant des outils prévu pour (genre yacc) ? tu veux le faire dans quel langage (je ne peut que recommender le Caml pour se genre de tâche).

Ou alors tu veux des précisions plus académique sur les différents type d´analyseur et sur ce qu´est une grammaire ?

sn00bino
sn00bino
Niveau 5
30 octobre 2007 à 10:34:26

Tu veux savoir comment implémenter un analyseur syntaxique pour construire ton AST ?

C ´est exactement sa, je souhaite le faire en C++.

dnob700
dnob700
Niveau 10
01 novembre 2007 à 00:20:11

"je souhaite le faire en C++."

malheur ... Mais tu veux connaître la théorie (ou en tout cas les algo qu´il y a dessus) et tu cherche des cours sur l´écriture d´un parseur (ça je peut t´aider) dans le but d´en écrire un toi même, ou alors tu veux juste obtenir un parseur en C++ en utilisant des outils fait pour ça (bison/yacc) qui permette d´utiliser un langage "plus simple" (ou en tout cas plus adapté) pour décrire une grammaire (LALR(1) pour yacc je crois) et qui te sorte un programme en C++. Dans ce cas là, je ne peut pas t´aider. Les bisons et autre outils C sont particulièrement infâmes, il doit y en avoir en C++, l´utilisation de POO ne pouvant qu´être un énorme bénéfice pour ça, mais je ne connais pas du tout. Je n´utilise ce genre d´outils qu´en Caml avec de la programmation fonctionnel.

saleGauss
saleGauss
Niveau 9
01 novembre 2007 à 11:53:33

caml et haskell powaaaaa !

/* end of troll */

sn00bino
sn00bino
Niveau 5
03 novembre 2007 à 12:29:44

Jveux bien les cours sur l´ écriture d´un parser. merci a toi Dnob.

sn00bino
sn00bino
Niveau 5
05 novembre 2007 à 13:37:15

"Mais tu veux connaître la théorie (ou en tout cas les algo qu´il y a dessus) et tu cherche des cours sur l´écriture d´un parseur (ça je peut t´aider)"

Alors c ´etait un fake ?

dnob700
dnob700
Niveau 10
05 novembre 2007 à 20:48:44

doucement ...

faut aussi que j´en trouve. Et pour ne pas te balancer n´importe quel lien il faut regarder un peu.
Le problème c´est qu´il y a peu de chose sur le net en accès libre (beaucoup de transparent, mais sans le prof qui va avec, c´est pas très utile), et encore moins en C++ (si tu veux un bouquin, tu peut lire "Compiler principles and tools" qui est la référence).

Pour écrire réellement un analyseur syntaxique, tu peut lire ça :
http://lambda.uta.edu/cse5317/long/ (les chapitre 1,2 et 3).
http://isoft.postech.ac.kr/Course/CS423/
http://pages.cpsc.ucalgary.ca/~robin/class/411/webnotes.html
http://www.mcs.drexel.edu/~rweaver/COURSES/MCS761/mcs761.html (très succint)

A chaque fois, c´est la partie sur le parsing qui t´intéresse.

Mais en relisant le haut, je me suis dit que ce n´est pas ce que tu veux. Si tu veux te construire une AST, le plus simple et efficace est quand même d´utiliser un outils fait pour ça. Dans ce cas là, il faut que tu t´intéresse à yacc (ou bison).

sn00bino
sn00bino
Niveau 5
06 novembre 2007 à 12:15:24

merci beaucoup. désolé de t´ avoir préssé. Je vais regarder yacc et bison mais je pense rester sur du c++.

dnob700
dnob700
Niveau 10
06 novembre 2007 à 16:47:37

yacc ou bison (c´est juste deux nom pour le même langage, mais dans diffrente version) c´est un outils qui permet de décrire la grammaire (dans une syntaxe proche de la notation BNF) et les actions associé (en C) et qui produit du code C en sortie.

Donc ça fait partie d´une chaîne de développement C. Ce n´est pas vraiment comme si c´était un autre langage et ça évite une énorme quantité de travail. Par contre ce n´est pas très adapté à du C++, mais des logiciels équivalents doivent exister pour le C++ (je parierais pour bison++ ou yacc++).

sn00bino
sn00bino
Niveau 5
10 novembre 2007 à 14:11:21

Dans le premier lien que m´ a filé Dnob je n´ arrive pas a appliquer la grammaire suivante :

S ::= ( L )
S ::= a
L ::= L , S
L ::= S

sur l´ expression (a,((a,a),a). Il marque bien la solution mais je ne comprend pas comment il y arrive. Si vous pouviez m´ expliquer.

merci d´ avance,

dnob700
dnob700
Niveau 10
10 novembre 2007 à 18:37:31

l´expression que tu nous donne est mal parenthésé, si c´est l´exemple c´est qu´il est faux, sinon, il faudrait que tu le corrige.

Dans tout les cas, la "difficulté" dans une grammaire comme ça, est fasse à un terme de type A,B,C (ou les majuscule sont des non terminaux) de savoir si, pour appliquer la règle L:=L,S tu va prendre L=A,B et S=C ou L=A et S=B,C. Ici, comme seule un L peut contenir des virgules au premier niveau, il n´y a pas d´ambiguïté et on peut avancer.

sn00bino
sn00bino
Niveau 5
10 novembre 2007 à 19:38:22

(a,((a,a),a)) excuse moi j´ ai oublié une parenthése.

dnob700
dnob700
Niveau 10
11 novembre 2007 à 22:29:23

Bin, ça ne me semble pas poser trop de problème :

S::=(L) où L = a,((a,a),a)
L::= L,S où L = a et S = ((a,a),a)
L::= S ou S = a (c´est fini)
S::= (L) ou L = (a,a),a
L::= L,S où L=(a,a) et S=a

et je te laisse terminer.

Et là, il n´y a même pas d´ambiguïté sur l´ordre d´application des règles.

sn00bino
sn00bino
Niveau 5
12 novembre 2007 à 12:10:18

Ok merci, je vois.
si je simule un ordi, ici je peux prendre
S::= (L) ou L = (a,a),a
L::= L,S où L = (a et S = a),a ( est-ce juste ? )
puis ensuite sa plante et je backtrack. ( est-ce juste ? )

dnob700
dnob700
Niveau 10
12 novembre 2007 à 13:42:50

on pourrait voir ça comme ça, sauf que ce n´est pas ainsi que fonctionne un parseur produit par yacc.

J´ai écrit ta grammaire en ocamlyacc (un dérivé de yacc pour caml) :
http://rafb.net/p/J56leR77.html
Tu ne devrais pas avoir de mal à comprendre le principe de la grammaire (on décrit juste quels sont les terminaux (ici L_PAR, R_PAR, COMMA et a) et les règles pour les non-terminaux (ici S et L).

Puis je l´ai compilé et je lui ai demandé de me sortir du pseudo code pour voir ce qu´il fait (option -v de ocamlyacc, je crois que ça marche aussi avec la version C).
Le résultat est le suivant :
http://rafb.net/p/ffSz7690.html

Il s´agit d´un automate à pile. Dans lequel il n´y a jamais de "retour arrière", car il y a suffisemment d´état différents pour que l´on puisse toujours savoir où il faut aller ensuite.
L´idée c´est que quand l´automate lis dans ton exemple :
( : là il sait qu´il est au début d´un S, c´est le seul possibilité et donc que le prochain caractère sera le début d´un L. Dans mon exemple, ça correspond à l´état 1 et on passe dans l´état 3 lorsqu´on lis le L_PAR.

Pour lire le fichier il faut voir ça :
state 3
S : L_PAR . L R_PAR (1)

L_PAR shift 3
a shift 4
. error

S goto 6
L goto 7

l´état 3 correspond à la règle S où l´on a déjà lu un L_PAR et on se trouve avant le L (le ´.´ marque l´endroit où l´on est en train de lire) puis tu as la liste des actions selon le token que tu rencontre. Les goto marque là où il faudra aller quand on reviendra dans cet état.

Ici, dans l´état 3, on lis un a, on pousse donc vers l´état 4, où l´on a rien d´autre à faire car on a fini de lire un S. n revient donc en 3 (parce que c´est là qu´on était précédemment, pas parce que c´est un numéro en dessous. C´est ce que tu pourrais appeler le back-tracking, sauf que c´est juste un retour de fonction, pas comme si on avait fait une erreur). Comme on revient en 3 et qu´on vient de lire un S, on part dans l´état 6, etc.

Et il y a suffisamment d´états différents (plus que de règles) pour que toute les possibilités soit gérées directement, sans avoir recours à du back-tracking. C´est le principe des grammaire LR(1) où tu peut toujours savoir dans quel état tu es en lisant un token devant toi. Il n´y aura donc jamais d´erreur de lecture nécessitant un retour en arrière. On peut écrire des grammaire plus générale, où ce n´est pas vrai, mais je crois qu´on a des théorème qui assure que toute grammaire valide peut se ramener à une grammaire LR(1) (mais avec une expression qui sera plus complexe).

sn00bino
sn00bino
Niveau 5
17 novembre 2007 à 17:22:28

a propos d´ automate a pile.

Quand dans l´ action table ya marqué r3 sa veut dire quoi ? je pensais reduce by rule 3 mais apparament non.

dnob700
dnob700
Niveau 10
17 novembre 2007 à 17:32:42

pas la moindre idée, tu peut montrer un exemple ?

sn00bino
sn00bino
Niveau 5
17 novembre 2007 à 17:58:19

dans le premier lien que tu m´ as filé, la section 3.3. Tu descends un peu et ya les tables action et goto dont je te parle.

dnob700
dnob700
Niveau 10
17 novembre 2007 à 18:22:01

Si c´est bien une réduction selon la règle 3, c´est dit juste au dessus du tableau en question. Ils ont juste appeler leurs règles 1, 2 et 3 au lieu de 0, 1 et 2 un peu avant je crois.

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment