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

Langage Perl Discussion :

Modification de l'AST [perl6]


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut Modification de l'AST
    Bonjour,

    Je continue à explorer les possibilités de l'analyse syntaxique en Perl6 et voici la question que, malheureusement, je n'arrive pas à résoudre seul.
    J'aimerai pouvoir analyser un chemin d'accès (unix) à un fichier. Ce chemin peut être composé de variables d'environnements ou pas. S'il y a des variables d'environnements, elles doivent être remplacées par leurs valeurs.
    exemple :
    (avec export $toto = totoenv)
    la chaine titi/$toto/tata/fichier doit devenir titi/totoenv/tata/fichier.

    Le code suivant trouve bien l'arbre syntaxique adéquat:

    ################
    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
     
    grammar TEST {
     
    rule  TOP     { :i \s*  [<chemin>]<file> }
     
        rule chemin { :i \s* [<slash>] *[<dir><slash>] *}
        rule dir     {  <varenv> | <mot> }
        token varenv {'$'<mot> }
        token file     { .* }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
        token slash     { '/' }
    }
     
    my $script = "titi/\$toto/tata/file" ;
    my $scr = TEST.parse($script);
    say $scr;
    ####################
    ===>
    「titi/$toto/tata/file」
    chemin => 「titi/$toto/tata/」
    dir => 「titi」
    mot => 「titi」
    slash => 「/」
    dir => 「$toto」
    varenv => 「$toto」
    mot => 「toto」
    slash => 「/」
    dir => 「tata」
    mot => 「tata」
    slash => 「/」
    file => 「file」
    Par contre, je n'arrive pas à obtenir un arbre syntaxique modifié conformément à mes besoins :
    J'ai essayé plusieurs solutions mais sans succès. Par exemple :
    ##########################
    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
     
    grammar TEST {
     
    rule  TOP     { :i \s*  [<chemin>]<file> }
     
        rule chemin { :i \s* [<slash>] *[<dir><slash>] *}
        rule dir     {  <varenv> | <mot> }
        token varenv {'$'<mot> }
        token file     { .* }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
        token slash     { '/' }
    }
     
    class ActionsTest {
        method chemin ($/) { $/.make( ~$/); }
        method dir ($/) { $/.make( ~$/); }
        method varenv ($/) { $/.make( %*ENV{$<chemin><dir><varenv><mot>}); }
        method mot ($/) { $/.make( ~$/); }
        method file($/) { $/.make( ~$/); }
        method TOP($/) { $/.make( ~$/); }
     
    }
     
     
    my $actions = ActionsTest.new;
    my $script = "titi/\$toto/tata/file" ;
    my $scr = TEST.parse($script,:$actions);
    say $scr;
    say $scr.made;
    ###########################
    ===>
    Use of Nil in string context
    in method varenv at ./test07.pl6 line 20
    「titi/$toto/tata/file」
    chemin => 「titi/$toto/tata/」
    dir => 「titi」
    mot => 「titi」
    slash => 「/」
    dir => 「$toto」
    varenv => 「$toto」
    mot => 「toto」
    slash => 「/」
    dir => 「tata」
    mot => 「tata」
    slash => 「/」
    file => 「file」
    titi/$toto/tata/file
    ------
    (Bien sur, la ligne 20 correspond à :
    method varenv ($/) { $/.make( %*ENV{$<chemin><dir><varenv><mot>}); } )
    Je ne comprend pas bien pourquoi j'ai ce message de "Use of Nil".
    D'autant plus que j'ai également ce message même lorsque je simplifie le chemin à $toto/file :
    ===>
    Use of Nil in string context
    in method varenv at ./test08.pl6 line 20
    「$toto/file」
    chemin => 「$toto/」
    dir => 「$toto」
    varenv => 「$toto」
    mot => 「toto」
    slash => 「/」
    file => 「file」
    $toto/file
    ---------------------

    Enfin, dernier point, en simplifiant à l'extrême, j'ai trouvé un moyen d'évaluer une variable d'environnement unix en perl :
    ###########################
    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
     
    grammar TEST {
     
    rule  TOP     { :i \s*  <varenv>  }
     
        token varenv {'$'<mot> }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
    }
     
    class ActionsTest {
        method TOP ($/) { $/.make( ~%*ENV{$<varenv><mot>}); }
    }
     
    my $actions = ActionsTest.new;
    my $script = "\$toto" ;
    my $scr = TEST.parse($script,:$actions);
     
    say $scr;
    say $scr.made;
    ###########################
    ===>
    「$toto」
    varenv => 「$toto」
    mot => 「toto」
    totoenv
    ----------------------------------

    Mais dés que j'essaie de mettre %*ENV dans une autre méthode que la méthode TOP, je reviens à l'erreur "Use of Nil ..." et la variable d'environnement n'est pas évalué
    ######################
    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
    grammar TEST {
     
    rule  TOP     { :i \s*  <varenv>  }
     
        token varenv {'$'<mot> }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
    }
     
    class ActionsTest {
        method varenv ($/) { $/.make( %*ENV{$<varenv><mot>}); }
        method TOP ($/) { $/.make( ~$/); }
    }
     
     
    my $actions = ActionsTest.new;
    my $script = "\$toto" ;
    my $scr = TEST.parse($script,:$actions);
     
    say $scr;
    say $scr.made;
    ######################
    ===>
    Use of Nil in string context
    in method varenv at ./test052.pl6 line 14
    「$toto」
    varenv => 「$toto」
    mot => 「toto」
    $toto

    Voilà où je bloque, si vous avez une solution, je suis preneur...

    Merci beaucoup pour votre aide.
    Bien cordialement,

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    je n'ai pas le temps aujourd'hui de regarder en détail et encore moins de tester, mais, à première vue, je ne vois pas comment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... %*ENV{$<chemin><dir><varenv><mot>} ...
    pourrait marcher, puisque %*ENV{$<chemin><dir><varenv><mot>} n'est sans doute pas une variable d'environnement de ton système, qui ne connaît probablement que $toto.

    Par ailleurs, je crains que cette définition:
    ne soit ambiguë, car le point peut reconnaître un slash. A mon avis il faudrait sans doute au minimum une classe de caractère négative du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    token file     { <-[/]>* }
    ou peut-être quelque chose de plus restrictif pour éliminer au moins certains caractères spéciaux, même si je sais bien que les noms de fichiers Unix ou Linux peuvent contenir au moins certains des caractères spéciaux (mais ça pose souvent de gros problèmes).

    Je pense qu'il y a d'autres problèmes dans ta classe d'actions, mais n'ai pas le temps de me pencher dessus dans l'immédiat. Essaie déjà de la faire marcher sans variable d'environnement, et ajoute une variable d'environnement quand le reste marche. (Je me trompe peut-être, mais je ne pense pas que le reste marche.)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup pour cette réponse.

    Peut-être est il utile que je simplifie ma question qui est essentiellement sur le fonctionnement de la classe Action. Ce que je ne comprend pas est que le programme suivant (programme 1) m'affiche bien la valeur de la variable d'environnement alors que le 2ieme programme m'affiche $toto et surtout le message "Use of Nil..."

    Programme 1:
    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
     
    grammar TEST {
     
    rule  TOP     { :i \s*  <varenv>  }
        token varenv {'$'<mot> }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
    }
     
    class ActionsTest {
        method TOP ($/) { $/.make( ~%*ENV{$<varenv><mot>}); }
    }
     
    my $actions = ActionsTest.new;
    my $script = "\$toto" ;
    my $scr = TEST.parse($script,:$actions);
     
    say $scr;
    say $scr.made;
    ce qui donne comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    「$toto」
    varenv => 「$toto」
    mot => 「toto」
    totoenv

    Programme 2:

    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
    #!/opt/rakudo-star-2016.10/bin/perl6
    use v6;
    grammar TEST {
     
    rule  TOP     { :i \s*  <varenv>  }
         token varenv {'$'<mot> }
        token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
    }
     
    class ActionsTest {
        method varenv ($/) { $/.make( %*ENV{$<varenv><mot>}); }
        method TOP ($/) { $/.make( ~$/); }
    }
     
     
    my $actions = ActionsTest.new;
    my $script = "\$toto" ;
    my $scr = TEST.parse($script,:$actions);
     
    say $scr;
    say $scr.made;
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Use of Nil in string context
    in method varenv at ./test052.pl6 line 14
    「$toto」
    varenv => 「$toto」
    mot => 「toto」
    $toto
    La seule différence entre les 2 programmes est que le programme 1 évalue la variable d'environnement au niveau de la methode TOP alors que le programme 2 fait la même chose avec la même instruction { $/.make( ~%*ENV{$<varenv><mot>});} au niveau de la methode varenv....
    Je ne vois par pourquoi cela est la cause de la différence de comportement ...


    Merci beaucoup pour votre aide.
    Bien cordialement,

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    essaie de modifier ta classe d'actions comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class ActionsTest {
        method TOP ($/) { make $<varenv>.made }
        method varenv ($/) { make %*ENV{$<mot>} }
    }
    Je pense que ça devrait marcher comme tu le souhaites.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    Super. Effectivement, je confirme, cela fonctionne exactement comme je le souhaite.
    (En plus, c'est logique un noeud ne voit que le sous arbre qui dépend de ce noeud.)
    Merci beaucoup pour cette aide précieuse qui me permet d'avancer dans ma connaissance de Perl 6.

    Merci encore.
    Bien cordialement,

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    si tu as eu une réponse satisfaisante résolvant ton problème, peux-tu marquer cette discussion comme résolue (avec le bouton bleu "Résolu")?

    Et si mes réponses t'ont aidé, tu peux aussi les approuver avec le bouton .

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

Discussions similaires

  1. Erreur lors de modification d'une table
    Par seb.49 dans le forum SQL
    Réponses: 11
    Dernier message: 13/01/2003, 17h16
  2. [VB6] modification de menu
    Par rikko23 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/11/2002, 21h30
  3. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Réponses: 11
    Dernier message: 23/07/2002, 14h33

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