[Perl] Raku : Grammaire et fichier Org

Alain Barbason alain at barbason.be
Dim 28 Juin 18:14:54 CEST 2020


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)

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);

-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/archives/perl/attachments/20200628/c84bfaac/attachment.html>


Plus d'informations sur la liste de diffusion Perl