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 :

Grammaire et fichier Org : Propriétés [perl6]


Sujet :

Langage Perl

  1. #1
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut Grammaire et fichier Org : Propriétés
    Bonjour,

    Dans les fichiers Org https://orgmode.org/, on peut avoir des propriétés structurée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :PROPERTIES:
    :key1:      content
    :key2:      content2
    :END:
    Je ne parviens pas à écrire ma grammaire pour lire cela convenablement.
    Dans la grammaire complète, (voir https://github.com/alainbebe/org-mod...rgMode.rakumod ), il y d'autres éléments, mais j'ai simplifié.
    Dans mes différents test, je parviens à matcher partiellement, mais soit juste une propriété et le texte, soit 1 ou 2 propriétés si pas de texte,...

    Une idée ?

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #!/usr/bin/env perl6
     
    use v6;
    use lib “lib”;
    use Data::Dump;
     
    grammar Content {
        token TOP        { ^ <header> \n? <properties>? <text>? $ }
        token header     { .*? $$  };
    #    token properties { ^^ ":PROPERTIES:\n" (.*?\n) ":END:\n" } # match just one property with text after, not two
    #    token properties { ^^ ":PROPERTIES:\n" (.*?\n) ":END:" $$ } # match just one property, not two
    #    token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+?) ":END:\n" } # match just one property, not two
    #    token properties { ^^ ":PROPERTIES:\n" (.*?) "\n:END:\n" } # no match
    #    token properties { ^^ ":PROPERTIES:\n" (.*?\n.*?\n) ":END:" $$ } # match just two property with text after, not one
    #    token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+) ":END:" $$ } # match but if no text after
    #    token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+) ":END:" \n? } # match but if no text after
    #    token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+) ":END:\n" } # no match
    #    token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+) ":END:" } # match but if no text after
        token properties { ^^ ":PROPERTIES:\n" ((.*?\n)+) ":END:" } #
        token text       { .* };
    }
    class Content-actions {
        method TOP($/) {
        }
        method header($/) {
            say "header : ",$/.Str;
        }
        method properties($/) {
            say "--properties--\n",$0.Str;
        }
        method text($/) {
            say "--text--\n",$/.Str;
        }
    }
     
    my $file =
    "One property, no text
    :PROPERTIES:
    :key1:      content
    :END:";
    Content.parse($file,:actions(Content-actions)).made;
    say "";
     
    $file =
    "2 properties, no text
    :PROPERTIES:
    :key1:      content
    :key2:      content2
    :END:";
    Content.parse($file,:actions(Content-actions)).made;
    say "";
     
    $file =
    "One property, with text
    :PROPERTIES:
    :key1:      content
    :END:
    my text";
    Content.parse($file,:actions(Content-actions)).made;
    say "";
     
    $file =
    "2 properties with text
    :PROPERTIES:
    :key1:      content
    :key2:      content2
    :END:
    my text";
    Content.parse($file,:actions(Content-actions)).made;
    Ca qui donne
    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
    header : One property, no text
    --properties--
    :key1:      content
     
    --text--
     
     
    header : 2 properties, no text
    --properties--
    :key1:      content
    :key2:      content2
     
    --text--
     
     
    header : One property, with text
    --text--
    :PROPERTIES:
    :key1:      content
    :END:
    my text
     
    header : 2 properties with text
    --text--
    :PROPERTIES:
    :key1:      content
    :key2:      content2
    :END:
    my text
    Le derniers cas devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    header : 2 properties, no text
    --properties--
    :key1:      content
    :key2:      content2
     
    --text--
    my text

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 859
    Points : 6 558
    Points
    6 558
    Par défaut
    Le soucis de token avec les quantificateurs, c'est que tu n'as le droit qu'à un seul essai. Donc si tu tentes d'avoir les propriétés suivi de texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    token properties { ^^ ":PROPERTIES:" \n ( [ \N+ \n ]+ ) ":END:" $$ }
    ne marchera pas car ":END:" $$ est testé sur la dernière ligne de texte (à cause du quantificateur gourmand) et donc échoue.

    Même chose avec un quantificateur non gourmand si j'ai plus d'une propriété:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    token properties { ^^ ":PROPERTIES:" \n ( [ \N+ \n ]+? ) ":END:" $$ }
    Là le quantificateur +? ne permettra d'atteindre que la première propriété et ":END:" $$ échouera sur la deuxième propriété.




    Pour solutionner ça, je vois deux possibilités:
    • soit tu renonces à token et tu optes pour regex qui lui peut laisser jouer les quantificateurs jusqu'à réussite (mais théoriquement tu perds en vitesse) avec:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      regex properties { ^^ ":PROPERTIES:" \n ( [ \N+ \n ]+? ) ":END:" $$ }
    • soit tu utilises un quantificateur gourmand tout en vérifiant que tu n'as pas atteint la ligne :END: à l'aide d'un test avant négatif (lookahead):
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      token properties { ^^ ":PROPERTIES:" \n ( [ <!before ":END:" $$> \N+ \n ]+ ) ":END:" $$ }


    À noter que dans l'esprit d'une grammaire, rien ne t'empêche de décomposer properties:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    token properties { ^^ ":PROPERTIES:" \n ( <property>+ ) ":END:" $$ }
    token property { ^^ <!before ":END:" $$> \N+ \n }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    Bon, ben j'ai pas encore tout compris, mais ça avance.
    Je prends évidemment la dernière solution avec "property", c'est évidemment plus clair. Et que je vais rapidement affiner pour limiter à détecter ":key: value".

    Un grand merci.

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

Discussions similaires

  1. spring copie des fichiers de propriétés dans web-inf
    Par austin P. dans le forum Maven
    Réponses: 4
    Dernier message: 11/07/2007, 14h40
  2. Comment modifier une propriété d'un fichier de propriétés?
    Par azerr dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 04/05/2007, 16h49
  3. [Servlet] Lire dynamiquement un fichier de propriétés
    Par n@n¤u dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/05/2006, 15h52
  4. [Resources] Fichier de propriétés ?
    Par hdd dans le forum Framework .NET
    Réponses: 4
    Dernier message: 07/12/2005, 13h02
  5. Réponses: 2
    Dernier message: 28/09/2004, 09h41

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