[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