/*
  *
   *  
    ~                      
   ~~                       ~
  ~  ~  Neuro-Translator   00
   ~~                       ° )
    ~                      ~
     ~  
   \_|_/_/`-,
     \_/  `-,

______________________________________________________________________.

XBNF_fr.html : documentation en Français
______________________________________________________________________.
___________________________________________________________________________.

    Neurotranslator is an XBNF grammar parser to translate several channels
    Copyright (C) 2011  Matthieu DAMEROSE / damo@cpan.org

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Neurotranslator.  If not, see <http://www.gnu.org/licenses/>.
___________________________________________________________________________*/



NeuroTranslator est un compilateur de grammaires de traduction déterministes et non déterministes permettant l'application de flux entrants et sortants
sur des canaux définies dans une grammaire XBNF (Xtended BNF).

Sommaire :
  1. Exemples XBNF
  2. Ligne de commande
  3. XBNF & NeuroTranslator
  4. Controller
  5. Fonctions
  6. options et paramètres

****************************************************************************
1. Exemples basiques de grammaires XBNF
****************************************************************************

Exemple sur quelques chiffres :
Dans cet exemple, le premier canal attend un chiffre et le second, une traduction écrite en Anglais, Français ou Espagnol.
L'ordre des option d'appel est important car il détermine si l'entrée ou  la sortie porte sur le premier ou le second canal.
num.xbnf :
axiome: nombre axiome | ()
nombre : num "/"
num : "1" # "one"|"un"|"unos"

num : "2" # "two"|"deux"|"dos"
num : "3" # "three"|"trois"|"très"
...

mail.txt :
1322
# xbnf -i mail.txt -o - num.xbnf
un/très/dos/two/


mail_text.txt :
dos/three/un/one/
# xbnf -o - -i mail_text.txt num.xbnf
2311


Traduction logique :
Traduction d'une expression logique parenthésée passée par l'entrée standard
en expression booléenne préfixée
sur la sortie standards.
logic.xbnf :

axiome : ou (RC)
      
ou : et "+" ou
     #
         "(ou " <et> (SP) <ou> (SP) ")"
ou : et

et : fact "." et
    #
     "(et " <fact> (SP) <et> (SP) ")"

et :  fact

fact : (SP) boolean
fact : (SP) "(" ou (SP) ")" | ou  # ou

boolean : "1" # "vrai"
boolean : "0" # "faux"

# xbnf -i - -o - logic.xbnf
(0+1).1+(0.(1+1))+1.0
^D

(ou (et (ou  faux  vrai)  vrai) (ou (et  faux (ou  vrai  vrai)) (et  vrai  faux)))
# xbnf -o - -i - logic.xbnf
(ou (et (ou  faux  vrai)  vrai) (ou (et  faux (ou  vrai  vrai)) (et  vrai  faux)))
^D

(0+1).1+(0.(1+1))+1.0

Grammaire equivalentes :
axiome : a b | b # z
a : {| "a" "A"}
b : {| "b" "B"}
z : {| "z" "Z"}
axiome : a b # z
axiome : b   # z
a : "a" | "A"
b : "b" | "B"
z : "z" | "Z"

Paire ou impaire :
Identification des suites de chiffre pair ou impaire par des  P ou I.
--- suite_chiffre.txt ---
680.12345.24680.13579.333444.
#  xbnf -i suite_chiffre.txt -o - parity.xbnf
pair.impair.pair.impair.pair.

--- parity.xbnf ---


<one-or-more>: nombre series

series : nombre series | ()

nombre: nb-pair   "."  # "pair."
nombre: nb-impair "."  # "impair."

nb-pair:  {| "0" "2" "4" "6" "8"} {! chiffre}
nb-pair:  chiffre nb-pair

nb-impair: {| "1" "3" "5" "7" "9"} {! chiffre}
nb-impair: chiffre nb-impair

chiffre: {| "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"}



Unix, perl et fichiers :
Convertion du résultat de find . en type abstrait de donnée Perl
axiome : listing 
       #
"
#
# Generated by Neuro-Translator / find-to-perl.xbnf
#
use Data::Dumper;
my $find = {};
"
       listing


listing : path (RC) listing
       #
       "$find->" path "={};\n" listing

listing : ()
       #
"
print Dumper($find);
"

path : {| "./" "."} path2  # "{'.'}" path2
path2 : filename "/" path2 # "{'"  filename "'}" path2
path2 : filename           # "{'"  filename "'}"
path2 : ()

filename: (STRING
      "abcdefghijklmnopqrstuvwxyz"
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      "0123456789"
      "-_.~#")



****************************************************************************
2. Options de ligne de commande NeuroTranslator
****************************************************************************


> xbnf <options> [ <XBNF files> ]

 <XBNF files> :  any XBNF file
 <options>    :
        -a categorie : grammar entry point
           if unspecified, first defined categorie

        -0         : skip this channel
        -f         : real-time input/output (=>)
        -i  <flux> : input flux to use
        -is <flux> : input flux using XBNF/SCOPE
        -o  <flux> : output flux to use
        -o+ <flux> : output flux to append
        -os <flux> : output flux using XBNF/SCOPE

        -i & -o flux options are binded on chanels
                with the order in declaration

        -c  <flux> : controller directives

 <flux> : file or stream to bind to the channel
          '-' stands for stdin as input (-i)
          '-' stands for stdout as output (-o)


 Misc options :
        -h  : help 
        -l  : print GNU licence
        -s : strict grammar (generate errors and warning)
        -d  : debugger 
        -di : internal debugger
        -mf  : matrix flux mode
        -mr  : matrix rules mode
        -ms  <step> : matrix steps
        -nc  : no color to terminal
        -v  : verbose mode
        -t  : auto-test mode
--arg arg0,arg1, ...   : provide running arguments
--stat      : provide statistical output
--progress  : see flux progression bar
--version   : gives running version

  
    
Sheebang Unix :
Permet de lancer un fichier grammaire en remodelant les options

Fichier grep.xbnf :


#!/usr/bin/xbnf sheebang $3 -i $2 -o - --arg $1 $0
// grep.xbnf <pattern> <file> [option facultative]

grep:
    (PARAM* o_loop_detection 1)
    search
search: line-ok search 
search: line-ko search # search
search: ()

line-ok:
    (SNAP {* {! "\n"} {! pattern}  . *})
    pattern
    (STRING-TO "\n") "\n"
        #
    [0] "{" [1] "}" [2] "\n"

line-ko:  {* {* {! "\n"} {! pattern} . *} "\n" *}
pattern: (ARG* 0)

bash# ./grep.xbnf "pattern" file

bash# ./grep.xbnf "pattern" file -v



       

Matrix mode :
Les options -mr (matrice des règles déployées) -mf -(matrice des flux)  permettent de visualiser les actions de neurotranslator.
L'option -ms <step> permet d'accélérer l'affichage selon les besoins.

# xbnf -mf -i samples/empty -o - samples/test.loop.xbnf
_ctrl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ|>| ctrl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ|>| trl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ|>|
...
iome: <declare_first>.پ|>| ome: <declare_first>.پ|>| me: <declare_first>.پ|>|
...
|>| پ|>| پ|>| پ<0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0><0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0
# xbnf -mf -ms 30 -i samples/empty -o - samples/test.loop.xbnf
|=| _ctrl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ!|=| _ctrl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ!|=| _ctrl : ..(INFLUX* "samples/empty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ!!!!!!!|>| mpty" axiome )..#..(OUTFLUX* () axiome )..#..().axiome: <declare_first>.پ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!|>| ) axiome )..#..().axiome: <declare_first>.پ!|>| ) axiome )..#..().axiome: <declare_first>.پ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!|>| lare_first>.پ!!!!!<0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0><0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0
# xbnf -mr -i samples/empty -o - samples/test.loop.xbnf
...
| <axiome> : # | <declare_first> : # | <looping1> : # | <loop0> ...
| <axiome> : # | <declare_first> : # | <looping2> : # | <loop0> :[0] #[1] | <loop1> :[0] #[1] ... | <loop2> :[0] #[1] | <A> :[0] # | <loop1> :[1] #[1] | <loop3> :[0] #[1] | <loop4> :[0] #[1] ... | <A> :[1] # | <loop1>
...
| <axiome> : # | <declare_first> : # | <looping2> : # | <loop0> :[0] #[1] | <0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0><0 <1 <2 <3 <4 <1 <3> 1> 4> 3><1 <3 <4 <1> 4> 3> 1> 2> 1> 0>



    
Debugger :
Les options -d grammaire utilisateur / -di pour suivre la grammaire XBNF interne

# xbnf -d -i samples/empty -o - samples/test.loop.xbnf ...
ENTER GRAMMAR <_ctrl> 0--|> n Grammar<_ctrl>::proceed() ...
Rule::proceed() INFLUX*::proceed() analysis... | <-- ENTER 1--|> n | <axiome> : # | <-- ENTER ...
4--|> n | <axiome> : # | <declare_first> : # | <looping1> : # | <loop0> :[0] #[0] | <-- ENTER
5--|> h <= pour afficher l'aide

5--|> C <= pour configurer le mode débug
Le *** dans la grammaire permet de poser un point d'arrêt, exemple :
..
A: loop1 A: loop1 ***

# xbnf -v -i samples/empty -o - samples/test.loop.xbnf
...
(BREAK) | <axiome> : # | <declare_first> : # | <looping1> : # | <loop0> :[0] #[0] | <loop1> :[0] #[0] ... | <loop2> :[0] #[0] | <A> :[0] # | <loop1> :[1] #[0] | <loop3> :[0] #[0] | <loop4> :[0] #[0] ... | <A> :[1] # | (BREAK) | <-- ENTER

/!\ bug en cours cette grammaire

Mode cache :
L'option -C (C majuscule) permet de générer un fichier {grammaire}.cache.{canal} correspondante à la grammaire parsée,
lors d'un second parsing avec la même grammaire, le parsing sera grandement accéléré.
Il s'agit d'une alternative au controller avec l'option -c (c minuscule) qui nécessite de paramétrer les commandes du contrôlleur).

# xbnf -C -i samples/empty -o - samples/test.loop.xbnf ...
# xbnf -C -i samples/empty -o - samples/test.loop.xbnf
...


****************************************************************************
3. Définitions des termes XBNF dans NeuroTranslator
****************************************************************************

Grammaire :

Une Grammaire XBNF est une extention de la grammaire BNF.
Une grammaire XBNF est un ensemble de définition regroupant éventuellement plusieurs des canaux.
L'application d'une grammaire sur un flux d'entré ou
de sortie est correcte si elle se concrétise
par la validation des flux d'entrés et par la capacité à générer un flux cohérent en sortie.


Une grammaire est déterminée par une catégorie d'entrée dite axiome et
de l'ensemble des catégories qui la compose.


Catégorie :

Une élément nommé pouvant être substitué logiquement à l'intérieur des règles par son contenu.

En lecture, une categorie est valide lorsqu'une définition valide pour le flux appliqué en entré.

Syntax : nom ou "<" nom ">" (les chevrons permettant l'utilisation de caractères non protégés)


Définition :

Définie les règles possibles pour chaque canal.
La cohérence de la définition détermine les canaux et règles cohérents entre eux,
Toute catégorie peut se voir enrichie d'une nouvelle définition avec autant
de définitions que nécéssaires.

Syntax :

// Première définition

cat : /* 1er canal */ # /* 2nd canal */ # ...

// Seconde définition

cat : ... # ... # ...


Définition directe :

Une définition directe permet de prioriser et générer le ou les flux de sorties dès que le canal en lecture est valide
(une règle a été parsée/validée).
Les définitions directes sont un moyen d'optimiser l'occupation mémoire pour des grammaires de type
recherche d'éléments, prompts, extraction de logs et plus généralement des flux d'entrées/sorties volumineux.

Syntax :

axiome : {* cat *}

cat = /* 1er canal */ # /* 2nd canal */ # ...


Canal :

Suite de règles possibles utilisablent sur le flux courant.
Rien n'indique le sens du flux : interprétable (flux d'entrée) ou productif (flux de sortie).
Est valide en entré le canal qui possède une règle valide pour ce flux d'entré.
Est valide en sortie le canal possèdant une règle ayant été validé en entré.
Si plusieurs règles peuvent valider un flux en entré, ou plusieurs règles produirent
sur le flux de sortie, la grammaire sera non-déterministe et soumis à des règles
de choix paramétrables ou aléatoire.


Syntax :

cat : /* règles du canal 1 */ ... | /* règle suivante du canal 1 */
              #
/* second canal */ ...
                # /* 3ieme canal */ ...


Les options { -i | -o | -0 } de la ligne de commandes doivent respecter l'ordre des canaux :
Règle :

Les éléments constitutifs de la règle valident la règle en entrée en validant chaqu'un d'eux.
Un éléments invalide invalide la règle entièrement.
La production d'un règle produit chaque éléments sequentiellement sur le flux.


EX:
"chaine" (APPEL ) ... "."


/!\ Les boucles :
Si le paramètre _o_loop_detection est vrai.
toute règle appelée sur le flux d'entrée se trouvant à la même position sur cette même règle appelée récursivement
est un considérée comme une boucle et ne produira rien mais restera valide.


Element :

L'element unitaire contenu dans une règle est soit un catégorie,
soit un terminal, soit une probabilité XBNF, soit un appel de fonction.

Terminal :

Position [<description du noeud>]:

EX:
Utilisation des positions [n]
A: B B B # [0] [1] [2]
B: elm0 elm1 elm2 # [2] [1] [0]


Une grammaire équivalente nécessite l'utilisation de catégories avec un nom différent dans chaque règle.
Utilisation des positions [n]
A: B1 B2 B3
B1: B
B2: B
B3: B
B: elm0 elm1 elm2 # elm2 elm1 elm0


EX2 :

Utilisation de noeud parent
A: id ...
B: A
C: A # [../../0] // récupère id analysé dans la categorie parente




****************************************************************************
4. Controlleur
****************************************************************************

Le controlleur a pour but premier de traiter plusieurs fichiers d'entré avec la même grammaire et
ainsi éviter d'avoir à re-parser la grammaire à chaque fichier d'entré et de sortie.

Le controlleur repose sur l'utilisation de fonctions particulières notée {nom}* dont
le traitement est lié à l'intialisation avant parsing.

Le caractère %%% indique la fin des commandes de paramétrage et déclenche la préparation et le parsing.
Une fois la traduction réalisée, le bloc suivant est traité.

option -c <fichier>

Exemple :

xbnf  -c samples/test.controller.xbnf samples/exemple1.xbnf
// samples/test.controller.xbnf

_ctrl :
    (INFLUX* "samples/exemple1.txt" exemple)
    #
    (OUTFLUX* () exemple)

%%%

_ctrl :
    (INFLUX* "samples/exemple2.txt" exemple)
    #
    (OUTFLUX* () exemple)

%%%


utilisation avec l'option -c - (stdin)

L'exemple ci-dessous montre qu'il est possible de controller XBNF avec des données passé sur l'entrée standard (stdin).

N'utilisation d'un pipe dans une application permet de controller les plusieurs fichiers d'entré pour une même grammaire.

cat samples/test.controller.xbnf | xbnf  -c - samples/exemple1.xbnf


fonctions d'initialisation du controleur

Les fonctions suivit d'une étoile permettent de controller XBNF à l'initialisation d'une grammaire.

          
          

          

          

****************************************************************************
5.Fonctions XBNF
****************************************************************************

Toute fonction est appelée "(" L'utilisation de cette fonction permet de gagner efficacement du temps par rapport à")".
La vérification des arguments est effectué à l'initialisation de la grammaire.

Notations :

>> comportement avec un flux en entré durant la lecture
<< comportement avec un flux de sortie durant la production

<> comportement quelquesoit le sens du flux

{ ... Sucres syntaxiques ...

     

          
          


          
          

Note: les formats de et correspondent à la fonction (NUMBER).
         

variables ...

/!\ Expérimental

Une variable noté @identifiant, permet de stocker une donnée de type terminal,
cad soit un numbre, soit une chaine de caractère.

A: (LET @a 0) (LET @msg "Nombre de points")
    count
    #
    @msg ": " @a


count: "." (OP "++" @a)





(fonctions)

         

          

          

          
          
                     

          

          

          

          

          

          

          

          

          


Argument :
command grep avec la chaine a rechercher en argument
--- samples/dump-number.txt ---
680.12345.24680.13579.333444.
--- samples/search.xbnf ---
axiome : number axiome | ()
number : (ARG 0) # "!"
number : (ARG 1) # "?"
number : .

#  xbnf -i samples/dump-number.txt -o - --arg 680,deux samples/search.xbnf
!.12345.24!.13579.333444.

          

*** or (BREAK)


          

(CATCH)


          

          

          

          

****************************************************************************
6. Options et paramètres.
****************************************************************************

Options accessibles par ligne de commande :

Paramètres accessibles via la fonction (PARAM*) :



Fin.