IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Conception d'un compilateur


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 419
    Points
    419
    Billets dans le blog
    15
    Par défaut Conception d'un compilateur
    bonjour,

    suis-je bien au bon endroit pour parler d'un problème qui me met dans l’embarras, dans le livre "compilateurs principes techniques et outils"?

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 673
    Points : 188 664
    Points
    188 664
    Par défaut


    Peut-être, voire très probablement. Quel est ce problème ? De là, on pourra le dire plus précisément .

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 419
    Points
    419
    Billets dans le blog
    15
    Par défaut
    c'est pour dire voilà:
    dans le chapitre sur l'analyseur syntaxique descendant, dans la section de rattrapage d'erreur, l'entrée M[E,')'] est synchro et M[F,+] est aussi synchro. Pourtant, dans l'entrée erronée ")id*+id$", la parenthèse fermante est sautée tandis que quand on arrive à l'étoile, c'est le non-terminal F qui est dépilé.
    quelqu'un pourrait-il m'éclairer su cette contradiction?

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 673
    Points : 188 664
    Points
    188 664
    Par défaut
    C'est donc bien le bon forum, mais la question est trop spécifique pour moi, je passe mon tour .

    Pourrais-tu donner plus de contexte, histoire que des gens qui n'ont pas le livre sous la main puissent réfléchir un peu à ta question ?

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    Pas sûr qu'on soit sur le bon forum, y a-t-il un forum voyance/boule de cristal ?

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 419
    Points
    419
    Billets dans le blog
    15
    Par défaut
    il y a tout un chapitre sur le sujet, je ne sais pas si je serais capable de tout résumer:
    grammaire non contextuelle :

    E -> T E'
    E' -> + T E' | epsilon (epsilon est la production vide)
    T -> F T'
    T' -> * F T' | epsilon
    F -> ( E ) | id

    table d'analyse :

    figure 4.22:

    Nom : tabledanalyse.png
Affichages : 498
Taille : 678,9 Ko
    Il y a une pile. Au départ, elle a le dollar au fond et l'axiome( = E ) au dessus et au somment. En avançant dans le flux d'entrée, de deux chose l'une. Le sommet de la pile est un terminal(un symbole d'entré id,+,*,(,),$) si le flux d'entrée donne un terminal qui est au somment de la pile, le terminal est dépilé et on avance dans le flux d'entrée. Sinon, il y a erreur. Si par contre le sommet de la pile est un non-terminal, on le dépile et on empile les symboles (terminaux et non-terminaux) de la production se trouvant dans la table d'analyse à la ligne du non-terminal et la colonne du terminal, avec le symbole le plus à gauche de la production, au sommet de la pile. cet algo se termine quand on a plus que le dollar dans la pile.

    pour le rattrapage sur erreur, l'idée est que si on rencontre une erreur, les symboles sont sautés jusqu'à avoir dans l'entrée un terminal élément d'un ensemble de synchronisation. Alors on saute le terminal et on dépile lorsque le terminal de synchronisation est rencontré dans l'entrée (c'est ce que j'ai compris).

    je cite le livre:
    Cette table s'utilise de la façon suivante. Si l'annalyseur syntaxique cheche l'entré M[A,a] (M est le tableau, A un non-terminal et "a" un symbole) et constate qu'elle est vide, alors le symbole d'entrée a est sauté.Si l'entrée est "synchro", alors le non-terminal au sommet de la pile est dépilé afin d'essayer de contiinuer l'analyse syntaxique. Si une unité lexicale au sommet de la pile ne correspond pas au symbole d'entrée,alors on déplie l'unité lexicale, comme indiqué précédement.
    Sur l'entrée erronnée )id*+id, l'analyseur et le mécanisme de ratrapâge d'erreur de la figure 4.22 se comporte comme indiqué à la figure 4.23

    figure 4.23:

    Nom : rattrapage.jpg
Affichages : 440
Taille : 372,7 Ko

    mon problème est que M[E,')'] est une entrée sychro E et n'est pas dépilé. Ils ont mis sychro à M[E,')'] car ')' est dans l'ensemble des symboles suivant E. Peut-être qu'il ne faudrais pas mettre '(' dans l'ensemble de synchronisation, malgré qu'il soit dans l'ensemble des suivants de E?
    qu'en pensez-vous?

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 419
    Points
    419
    Billets dans le blog
    15
    Par défaut
    je peux peut-être faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    X=sommet de la pile;
    symbole=analex(); //analex est la fonction qui donne l'unité lexicale suivante
    while(X!=dollar){  //dollar sert de marqueur de fin et se trouve au fond de la pile (ils disent "le terminal qui n'existe dans aucune grammaire")
       if(X==E && symbole==PF){   //PF=parenthèse fermante
          do{
             //chercher ici le non-terminal suiv tel que symbole est dans l'ensemble des premiers de suiv
             if(pas trouvé)
                symbole=analex();
          }while(pas trouvé de non-terminal dont symbole est dans l'ensemble PREMIER(suiv) && symbole!=dollar);
          if(symbole!=dollar){ //dollar sert aussi à indiquer la fin du fichier
             dépiler(); // on dépile E
             empiler(suiv);
             continue;
          }
          else
             //fin prématurée du fichier source
       }
       else if ... //autres cas
       symbole=analex();
       X=sommet de la pile;
    }
    qu'en pensez-vous?

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 419
    Points
    419
    Billets dans le blog
    15
    Par défaut
    l'algo de mon précédent post est faux car il y a plusieurs solutions pour suiv.

    je crois que j'ai compris ce qu'ils disent dans ce livre:

    dans la figure 4.23, on lit "id est dans premier de E". Cela signifie que,après avoir dépilé E, car à la ligne E et la colonne parenthèse fermante on a "synchro", puisque le symbole qui suit est id, et que à la ligne E et à la colonne id la case n'est pas vide, ni synchro, alors E est à nouveau empilé.

    ensuite, quand on arrive à " * + id $" avec " * F T' E' " dans la pile, l’étoile dans l'entrée correspond au sommet de la pile. Elle est donc dépilée et on passe à l'unité lexicale suivante. L'entrée contient alors "+ id $" et la pile "F T' E' ". comme dans la table, à la ligne F et colonne +, on trouve "synchro", F est dépilé. La pile contient alors " T' E' ". Comme à la ligne T' et la colonne '+' on a la production vide, on empile pas d'autre non-terminaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    X=sommet de la pile;
    symbole=anaLex();
    while(X!=DOLLAR){
       if(X==symbole){
          depiler();
          symbole=anaLex();
       }
       else if(X==E && symbole==PF){  //PF=parenthèse fermante
          depiler(); // on dépile E
          symbole=anaLex();
          if(symbole==ID||symbole==PO) //PO= parenthèse ouvrante
             empiler(E);
       }
       else if(X==E && (symbole==PLUS||symbole==ETOILE)){
          cerr<<"ligne "<<numLigne<<" identificateur ou parenthèse ouvrante attendu ici"<<endl;
          symbole=anaLex();
       }
       else if(X==E && symbole==ID){
          cout<<"E -> T E'"<<endl;
          depiler();
          empiler(Eprim);
          empiler(T);
       }
       else if(X==F && symbole==PLUS){
          depiler(); //on dépile F
          X=sommet de la pile;
       }
       else if(X==Tprim && (symbole==PLUS||symbole==PF||symbole==DOLLAR){  //PF=parenthèse fermante
          depiler();
          X=sommet de la pile;
       }
       else if(autres cas)
          ...
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conception d'un compilateur (Parser)
    Par lastico21000 dans le forum Langage
    Réponses: 1
    Dernier message: 12/05/2011, 20h03
  2. compilateur c++ langage de conception
    Par guillaume07 dans le forum C++
    Réponses: 11
    Dernier message: 01/10/2010, 14h36
  3. conception et realisation d'un compilateur
    Par id.prog dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 20/10/2008, 14h35
  4. [Concept] Réplication
    Par melinda dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 31/03/2003, 17h29
  5. [Concept] Stabilité d'une base de donnée
    Par lassmust dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/07/2002, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo