[Perl] Raku : Grammaire et fichier Org
Alain Barbason
alain at barbason.be
Lun 6 Juil 08:06:48 CEST 2020
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
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/archives/perl/attachments/20200706/90c0b4ca/attachment-0001.html>
Plus d'informations sur la liste de diffusion Perl