Une expression régulière (une vrai, pas une avec toutes les extensions non-régulières ala Perl) ne peut pas forcément modéliser une BNF.
Par exemple :
<foo> ::= 'a' [<foo>] 'b' |
Est une BNF très simple (les mots a+b+ avec autant de a que de b) que tu ne peut pas faire avec une simple regexp.
Cela dit en jetant un premier coup d'oeil, cette BNF semble faisable de faire ça avec une regexp.
Si tu tiens à faire ça avec une regexp, commence déja par la construire par petit bout, et débugge chaque morceau séparément.
Commence par écrire les regexp des règles terminales de ta BNF (les règles qui appellent pas d'autres règles, juste des séries de caractères comme <lettre>, <spécial> ou <non blanc> ).
Puis crée les règles non-terminales en concaténant les variables des autres regexp (en oubliant pas les | [] et les parenthèses non-capturantes) pour la priorité.
Teste séparément chaque règle avant de la réutiliser, en faisant comme ça tu t'en sortira plus efficacement qu'en triturant un super-monstre de 4km de long.
PS: quand je dis concaténer les regexp, je veut dire concaténer la chaine de caractère qui définit la regexp, si tu additionne directement des regexp ça va pas marcher.
Message édité par 0x90 le 18-07-2009 à 05:14:08
---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.