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 :

[Compilation] Choix d'une méthode d'analyse


Sujet :

Algorithmes et structures de données

  1. #1
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut [Compilation] Choix d'une méthode d'analyse
    Bonjour à tous,

    je suis en train d'implémenter (en Python) la spécification de XPath du W3C, et je m'interroge sur la méthode d'analyse adéquate. Voici un extrait de la grammaire en question, celui qui concerne les opérations arithmétiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [25]    AdditiveExpr    ::=    MultiplicativeExpr  
                                   | AdditiveExpr '+' MultiplicativeExpr  
                                   | AdditiveExpr '-' MultiplicativeExpr  
    [26]    MultiplicativeExpr    ::=    UnaryExpr  
                                         | MultiplicativeExpr MultiplyOperator UnaryExpr  
                                         | MultiplicativeExpr 'div' UnaryExpr  
                                         | MultiplicativeExpr 'mod' UnaryExpr  
    [27]    UnaryExpr    ::=    UnionExpr  
                                | '-' UnaryExpr
    Voilà où j'en suis de mes réflexions : l'analyse LL(1) m'est interdite, car les règles sont (massivement) récursives à gauche ; même problème avec la descente récursive. Je vais donc sans doute devoir opter pour une analyse ascendante, et a priori la technique de la précédence d'opérateurs conviendrait, et ne serait pas trop complexe à coder.

    J'ai deux questions à soumettre à votre sagacité :

    1°) Suis-je complètement à côté de la plaque, quant aux prémisses du choix de la méthode d'analyse ?
    2°) Que me conseilleriez-vous ?


  2. #2
    Membre confirmé

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Points : 607
    Points
    607
    Par défaut
    C'est trés vieux pour moi et bien que ne connaissant pas la complexité algorithmique de ce type de méthode, pourquoi ne pas simplement supprimer la récursivité à gauche dans un premier temps ?

    Ludo

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    C'est trés vieux pour moi et bien que ne connaissant pas la complexité algorithmique de ce type de méthode, pourquoi ne pas simplement supprimer la récursivité à gauche dans un premier temps ?
    Je l'avais tenté, mais le problème est que si j'inverse la règle pour avoir une récursivité à droite, l'analyse porte en priorité sur les chaînes les plus courtes et je me retrouve avec un problème de précédence d'opérateurs (bref, ça calcule faux !).

  4. #4
    Membre confirmé

    Homme Profil pro
    Indépendant
    Inscrit en
    Juin 2002
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 540
    Points : 607
    Points
    607
    Par défaut
    Citation Envoyé par GrandFather
    ... et je me retrouve avec un problème de précédence d'opérateurs (bref, ça calcule faux !).
    cad ? un langage à pile ? (c'est plus par curiosité)

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    La spécification du W3C ne donne que la grammaire et les règles de fonctionnement, mais la méthode d'analyse du langage est laissée à la discrétion de celui qui implémente.

    En fait, j'avais opté au départ pour un interpréteur, donc pour une analyse LL avec un calcul au fur et à mesure de l'analyse, ne nécessitant donc pas de pile. J'avais (naïvement) interverti les éléments de chaque règle pour éviter les boucles infinies, avant de me rendre compte que ça ne respectait pas la précédence des opérateurs.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut
    As-tu essayé ça:

    ftp://ftp.fourthought.com/pub/BisonGen/

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Juste une question sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [27]    UnaryExpr    ::=    UnionExpr 
                                | '-' UnaryExpr
    Ça veut dire que tu admets des choses comme

    - - - - - 3 ?

    ou j'ai rien compris

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par DrTopos
    As-tu essayé ça:

    ftp://ftp.fourthought.com/pub/BisonGen/
    Bison génère du code en C, il me semble...

    En tout cas, merci DrTopos, je vais étudier cela...

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Trap D
    Ça veut dire que tu admets des choses comme

    - - - - - 3 ?

    ou j'ai rien compris
    Tout à fait.
    C'est l'opérateur (arithmétique) de plus haute priorité de la grammaire.

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    D'accord, donc tu n'utilises pas les parenthèses ?
    Tu ne peux pas utiliser la notation polonaises ? tu n'aurais plus de problème de précédence.

  11. #11
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Tu peux t'en sortir en réécrivant les règles récursives à gauche à condition d'introduire les symboles suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {} pour indiquer un groupement
    [] pour indiquer un choix
    * pour indiquer une répétition facultative
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AdditiveExpr       ::=  MultiplicativeExpr {[+ -] MultiplicativeExpr}*
    MultiplicativeExpr ::=  UnaryExpr {[MultiplyOperator 'div' 'mod'] UnaryExpr}*
    et la reconnaissance de la règle AdditiveExpr en pseudo-code Java :
    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
     
    TreeNode additiveExpr() {
      TreeNode m = multiplicativeExpr();
      if (m == null) {
        // Erreur
      }
     
      Token t = currentToken();
      while (t == PLUS || t == MINUS) {
          nextToken();
          TreeNode n = multiplicativeExpr();
          if (n == null) {
            // Erreur
          }
     
          m = new TreeNode(m, t, n);
          t = currentToken();
        }
      }
      return m;
    }

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut
    Citation Envoyé par GrandFather
    Bison génère du code en C, il me semble...
    Non, justement, BisonGen génère du code en Python (si j'ai bien compris), et il accepte la grammaire au format XML.

    L'élimination de la récursion gauche à la main dans une grammaire contenant visiblement plus de 30 règles risque d'être très périlleuse. De toute façon je pense que toute méthode à la main risque d'être périlleuse. J'ai moi aussi fait des parsers à la main et je ne connais pas de programmation plus galère que ça. A tel point que dans mon langage Anubis, j'ai même commencé la réalisation d'un clone de YACC/BISON. Je suis allé jusqu'à la génération de l'automate, mais je n'ai pas encore écrit le code qui transforme cet automate en programme Anubis. Il faut dire qu'avec Anubis, il y a de telles contraintes de type, que c'est un peu un casse-tête.

    Je ne sais pas ce que va donner BisonGen, mais si ça marche, il n'y a pas à hésiter. Avec ta grammaire, il se peut que l'automate réalisé par BisonGen contienne plusieurs centaines d'états. Pour la gramaire d'Anubis, qui n'est pas très compliquée quand même, mais qui contient elle aussi plein de récursion gauche, l'automate généré par Bison a 624 états. Autant dire que faire ça à la main est presque suicidaire.

    Ce que tu peux faire est de vérifier que l'automate généré par BisonGen est le même que celui généré par BISON. J'ai tout à fait confiance en ce que fait BISON, pour l'avoir utilisé des centaines de fois. Ce serait une sécurité.

  13. #13
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Trap D
    Tu ne peux pas utiliser la notation polonaises ? tu n'aurais plus de problème de précédence.
    En fait, la grammaire XPath est partagée entre 4 types de règles (en tout une quarantaine de règles) :
    - celles qui régissent l'analyse lexicale
    - celles qui traitent des opérations mathématiques (celles que j'ai postées)
    - celles qui traitent des opérateurs logiques
    - celles qui définissent la recherche dans un arbre XML (ça ressemble à un chemin de fichier Unix, avec des prédicats en plus)
    La notation polonaise réglerait mon problème de précédence, mais ne m'arrangerait pas du tout pour implémenter le restant des règles.

    herve91 >> Effectivement, ça règlerait le problème des opérations arithmétiques, mais je me vois mal modifier le reste des règles... Comme je n'ai pas le bagage théorique pour pouvoir m'assurer que les deux grammaires resteront équivalentes, je préfère suivre le conseil de DrTopos et essayer de trouver une méthode d'analyse qui ne nécessite pas (ou très peu) de modification de la grammaire.

    DrTopos >> Ca semble effectivement être la solution optimale, d'autant plus que les créateurs de BisonGen sont également ceux de plateforme 4suite, qui par ailleurs intègre une implémentation de XPath en Python qui fait référence. Un gage de sérieux, a priori.


  14. #14
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Vos conseils m'ont permis d'y voir plus clair, et d'arrêter une décision : je vais transformer la grammaire afin de pouvoir lui appliquer la méthode de la descente récursive.

    à tous !

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

Discussions similaires

  1. Choix d'une méthode d'optimisation
    Par Omar777 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 12/06/2015, 13h03
  2. Réponses: 1
    Dernier message: 16/05/2015, 08h40
  3. Choix d'une méthode pour extraire des données web
    Par Serphone dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 26/06/2012, 10h25
  4. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  5. Réponses: 6
    Dernier message: 08/01/2010, 21h11

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