[Perl] Raku : Grammaire et fichier Org

Alain BarBason alain at barbason.be
Ven 17 Juil 09:36:40 CEST 2020


Bonjour,

J'ai trouvé.

my $level;
grammar OrgMode {
     rule  TOP       { ^ <tasks> $ }
     rule  tasks     {  <task>+ }
     token task      { <content> <tasks>? {$level=$level.substr(0,*-1)}}
     token content   { ^^ ($level "*"+)" "{$level=$0} .+? <?before ^^"*" 
|| $ >  }
}


Le 6/07/20 à 08:06, Alain Barbason a écrit :
> Bonjour,
> 
> Désolé pour le retour tardif, mais je n'ai reçu le mail qu'aujourd'hui.
> 
> J'ai du mal expliquer mon exemple .
> 
> Dans le programme, j'ai une variable $mail où j'ai mis une série 
> d'exemple, avec un split \n\n pour faire "comme ci" c'était des fichiers 
> lu séparément.
> 
> Et chaque résultat est séparé par une ligne 
> -------------------------------------
> 
> (c'est plus facile pour tester et à poster)
> 
> Tous fonctionnent sauf le dernier.
> 
> 
> Alain.
> 
> Le 28/06/20 à 23:06, Laurent Rosenfeld a écrit :
>> Bonsoir,
>>
>> pourrais-tu donner des exemples simples de données pour lesquels ton 
>> programme marche (avec le résultat obtenu, si possible) et des 
>> exemples pour lesquels ça ne marche pas ?
>>
>> Bonne soirée,
>> Laurent.
>>
>> Le dim. 28 juin 2020 à 18:15, Alain Barbason <alain at barbason.be 
>> <mailto:alain at barbason.be>> a écrit :
>>
>>     Bonjour,
>>
>>     Pour mon programme d'interfaçage graphique de fichier Org
>>     (https://github.com/alainbebe/org-mode-gtk.raku), j'aimerais lire
>>     les fichiers Org à l'aide la grammaire de Raku.
>>
>>     Je suis parvenu à lire des fichiers en liste et/ou en récursif,
>>     mais quand le fichier contient une nouvelle tâche avec une
>>     indentation en moins, je coince.
>>     Le code ci-dessous match chaque fichier (simulé dans $file), mais
>>     , dernier exemple, place en niveau 2 une tâche qui devrait être en
>>     niveau 1. Ce qui me paraît normal vu le code. J'ai essayé la ligne
>>     12, mais ça ne match pas.
>>
>>     Une idée ?
>>
>>     (posté déjà sur developpez.com <http://developpez.com>)
>>
>>     AlainBB
>>
>>     #!/usr/bin/env perl6
>>       
>>     use  v6;
>>     use  Data::Dump;
>>     use  Grammar::Tracer;
>>       
>>     my  $level;
>>     grammar  OrgMode{
>>          rule   TOP{  ^<tasks>  $}
>>          rule   tasks{   \n?<task>+ %%\n}
>>          token  task{  <content>  <tasks>?{$level=""}}
>>     # token task { <content> <tasks>? {$level=$level.substr(0, *-1)}}
>>          token  content{  ^^($level  "*"+)" "  .+? $${$level=$0.Str}}
>>     }
>>       
>>     class  OM-actions{
>>          method  TOP($/)  {
>>              make$<tasks>.made;
>>          }
>>          method  tasks($/)  {
>>              make$<task>».made ;
>>          }
>>          method  task($/)  {
>>              my  %task;
>>              %task{"task"}=$<content>.made;
>>              %task{"sub-task"}=$<tasks>.madeif  $<tasks>.made;
>>              make%task;
>>          }
>>          method  content($/)  {
>>              make$/.Str  ;
>>          }
>>     }
>>       
>>     my  $file  =
>>     "* juste un header 1
>>       
>>     * juste deux header 1
>>     * header 2
>>       
>>     * juste 3 header 1
>>     * header 2
>>     * header 3
>>       
>>     * juste un header 1 et un sub
>>     ** sub-header 1
>>       
>>     * juste un header 1 et deux sub *
>>     ** sub-header 1
>>     ** sub-header 2
>>       
>>     * juste un header 1 et un sub et un sub-sub
>>     ** sub-header 1
>>     *** sub-sub-header 1
>>       
>>     * 2 header 1 et un sub au milieu
>>     ** sub-header 1
>>     * header 2"
>>     ;
>>       
>>     say"\n"  x10;
>>     sub  parse_file($file)  {
>>          say$file;
>>          say"";
>>          $level="";
>>     # say OrgMode.parse($file);
>>          say Dump OrgMode.parse($file,:actions(OM-actions)).made;
>>          say"---------------------------------------------------------------------------------------";
>>     }
>>       
>>     parse_file($_)  for  split("\n\n",$file);
>>
>>     _______________________________________________
>>     Perl mailing list
>>     Perl at mongueurs.net <mailto:Perl at mongueurs.net>
>>     http://listes.mongueurs.net/mailman/listinfo/perl
>>     Attention, les archives sont publiques
>>
>>
>> _______________________________________________
>> Perl mailing list
>> Perl at mongueurs.net
>> http://listes.mongueurs.net/mailman/listinfo/perl
>> Attention, les archives sont publiques
> 
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
> Attention, les archives sont publiques
> 


Plus d'informations sur la liste de diffusion Perl