Bonjour !

Depuis quelques jours je cherche, je trouve des trucs qui ne fonctionnent pas, ou pas documentés... donc je viens vous demander...

Je bosse sur une appli java qui manipule des fichiers ABC (notation musicale)
La grammaire BNF de ce format est ici : http://www.norbeck.nu/abc/bnf/abc20bnf.txt
Dans cette appli, les définitions des états, tokens, et le parser ont été écrits "à la main" et la maintenance est assez difficile.
Modifier le BNF est plus facile (par exemple pour accepter les fichiers .ABC qui dépassent un peu de la norme, ou mal écrits...)

Je cherche donc un programme (java si possible) qui génère les classes nécessaire pour parser les fichiers ABC.

Exemple de fichier simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
X:1
T:Fichier ABC tout simple
C:iubito
%un commentaire
M:2/4
L:1/8
K:D
DE FG | A_B cd
On a un header contenant :
- X:1 = numéro de morceau
- T:le titre
- C:le compositeur
- M:la métrique
- L:longueur de note
- K:la tonalité (ré majeur)
puis un corps contenant
- 2 notes (D et E)
- un espace (ayant une signification)
- 2 notes (F et G)
- un espace (mais on s'en fout)
- une barre de mesure
- un autre espace sans signification
- 2 notes (A et B) dont la deuxième est altéré (_ = bémol)
- un espace (ayant une signification)
- 2 notes (c et d)

J'aimerai récupérer ses infos dans une structure arbre du genre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
abc-file {
  abc-tune {
    abc-header {
      field-number = "X:1"
      title-fields {
        field-title {
          tex-text = "T:Fichier ABC tout simple"
        }
      }
      other-field {
        field-composer = "C:iubito"
        comment = "%un commentaire"
        field-meter {
          string = "M:"
          time-signature { ... }
        }
        field-length {
          string = "L:"
          note-length-strict { ... }
        }
      }
    }
    abc-music {
      abc-line {
        element {
          stem {
            note {
              pitch {
                basenote = "D"
              }
            }
          }
        }
        element...stem......basenote = "E"
        element { WSP = " " }
........................etc......etc........
      }
    }
  }
}
Si quelque chose n'est pas reconnu car pas dans la grammaire, plutôt que de mettre un fail général sur le fichier, ignorer l'élément foireux ou le marquer comme "erreur", et continuer à parser la suite...


J'ai trouvé
- BNF-for-Java, avec une interface graphique... mais zéro doc, j'en ai rien tiré
- JavaCC - me semble bien compliqué, pas compris la doc
- BNF Converter - j'ai beau formater différemment le fichier BNF, ça veut pas
- AntLR - j'en ai rien tiré
- SableCC - je lis la doc....
- beaver - pas assez insisté

Quelles sont vos expériences en la matière?