OVH Cloud OVH Cloud

ABNF -> regexp

8 réponses
Avatar
Antoine Bellot
Bonjour à tous,

De sorte à me faciliter l'écriture de petits programmes identifiant
l'éventuelle validité de certaines données par rapport aux
spécifications proposées par les RFCs, je cherche un moyen simple et sûr
de convertir une description faite en notation ABNF en une expression
régulière.

Google signale l'existence d'un produit écrit en Ruby, dont l'usage
serait prohibitif pour tout autre langage de script supportant déjà les
expressions régulières.

Existe-t-il un jeu de règles de substitutions à base d'expressions
régulières permettant d'associer à une notation ABNF arbitraire
l'expression régulière équivalente ? ou existe-t-il une raison que je ne
comprends pas pour laquelle cela serait impossible ?


--
Antoine Bellot

8 réponses

Avatar
Alain Ketterlin
Antoine Bellot writes:

Existe-t-il un jeu de règles de substitutions à base d'expressions
régulières permettant d'associer à une notation ABNF arbitraire
l'expression régulière équivalente ? ou existe-t-il une raison que je ne
comprends pas pour laquelle cela serait impossible ?


Ca n'existe pas parce que c'est impossible. La puissance d'expression
des grammaires ABNF est superieure a celle des expressions regulieres.
(Exemple : n'importe quel langage contenant des parentheses
equilibrees.)

Par contre, il est possible (en theorie) de passer d'une ABNF a (par
exemple) un fichier yacc/bison. En pratique cela peut etre plus
complique.

-- Alain.

Avatar
Pascal Bourguignon
Antoine Bellot writes:

Bonjour à tous,

De sorte à me faciliter l'écriture de petits programmes identifiant
l'éventuelle validité de certaines données par rapport aux
spécifications proposées par les RFCs, je cherche un moyen simple et
sûr de convertir une description faite en notation ABNF en une
expression régulière.

Google signale l'existence d'un produit écrit en Ruby, dont l'usage
serait prohibitif pour tout autre langage de script supportant déjà
les expressions régulières.

Existe-t-il un jeu de règles de substitutions à base d'expressions
régulières permettant d'associer à une notation ABNF arbitraire
l'expression régulière équivalente ? ou existe-t-il une raison que je
ne comprends pas pour laquelle cela serait impossible ?


Ça dépend de la grammaire écrite en ABNF. En toute généralité, c'est
impossible: il y a des languages analysés par une grammaire
context-free qui ne peuvent pas être analysés par des expressions
régulières. Par exemple, quand il y a des règles récusives. Essaye
d'écrire une regexp qui accepte et qui refuse les mêmes mots que:

( ( 'a' 'b' 'c' '(' ')' '+' '-' '*' '/' )
( E F T I )
E
(
E --> F + F | F - F .
F --> T * T | T / T .
T --> ( E ) | I .
I --> a | b | c .
))


--
__Pascal_Bourguignon__
http://www.informatimago.com/

Avatar
Paul GABORIT
À (at) 06 Nov 2003 07:26:10 +0100,
Alain Ketterlin écrivait (wrote):
Antoine Bellot writes:

Existe-t-il un jeu de règles de substitutions à base d'expressions
régulières permettant d'associer à une notation ABNF arbitraire
l'expression régulière équivalente ? ou existe-t-il une raison que je ne
comprends pas pour laquelle cela serait impossible ?


Ca n'existe pas parce que c'est impossible. La puissance d'expression
des grammaires ABNF est superieure a celle des expressions regulieres.
(Exemple : n'importe quel langage contenant des parentheses
equilibrees.)


Mais certains langages de scripts (au moins Ruby et Perl) ont des moteurs de
regexp étendues qui permettent (tout du moins en théorie) de le faire.

Pour Ruby, on trouve effectivement <http://cvs.m17n.org/~akr/abnf/>.

Pour Perl, j'ai cherché mais je n'ai pas trouvé. Il faut dire que toutes les
extensions du moteur de regexp ne sont pas encore officiellement stabilisées
(que ce soit sur leur syntaxe ou sur leur sémantique exacte)

Et puis, il ne suffit pas de convertir automatiquement. Encore faut-il que le
résultat soit efficace. Et là, j'ai quand même un doute. Une bonne vieille
grammaire passée par yacc ou bison (ou leur équivalent Perl, Ruby ou Python)
me semble quand même plus optimisée. Et ça, c'est sûrement (encore une fois en
théorie ;-) automatisable.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>


Avatar
Pascal Bourguignon
Paul GABORIT writes:
[...]
Pour Ruby, on trouve effectivement <http://cvs.m17n.org/~akr/abnf/>.

[...]
Et puis, il ne suffit pas de convertir automatiquement. Encore faut-il que le
résultat soit efficace. Et là, j'ai quand même un doute. Une bonne vieille
grammaire passée par yacc ou bison (ou leur équivalent Perl, Ruby ou Python)
me semble quand même plus optimisée. Et ça, c'est sûrement (encore une fois en
théorie ;-) automatisable.


Oui! Yaqu'à voir le résultat dans l'URL indiqué!

Et surtout, hormis les cas les plus simples, s'il y a une grammaire,
c'est qu'il y a des éléments à identifier et à traiter indépendament
des autres. Un regexp, ça dit seulement si ça passe ou si ça casse
(avec seulement une maigre possibilité de retour de quelques
sous-expressions, mais sans savoir vraiment où les rattacher dans
l'arbre syntaxique...).

--
__Pascal_Bourguignon__
http://www.informatimago.com/

Avatar
Antoine Bellot
<snip d'excellentes contributions>

Merci pour l'ensemble des précisions que je n'aurais jamais pu trouver
seul du fait de mes lacunes académiques.

En pratique, la plupart des solutions proposées ne sont pas applicables
à mon cas, puisque je cherchais surtout à intégrer les RFCs elles-mêmes
dans un lot de fichiers sources pour générer à la vérification des
dépendances des expressions régulières qu'utiliseraient directement des
sources C pour "inspirer confiance" en employant une méthode simple et
robuste (et sans pour autant créer de dépendance externe à un énième
interprète).

En pratique, vu l'usage souvent très limité que font les RFCs d'ABNF
(que je souhaitais éviter de devoir connaître), il sera certainement
possible de faire quelque chose de moins élégant dans ce cas
particulier, mais j'espérais bien ne pas avoir à le faire moi-même :-)

--
Antoine Bellot
Extensibility : the inability to get it right up front.
Avatar
Pascal Bourguignon
Antoine Bellot writes:

<snip d'excellentes contributions>

Merci pour l'ensemble des précisions que je n'aurais jamais pu trouver
seul du fait de mes lacunes académiques.

En pratique, la plupart des solutions proposées ne sont pas
applicables à mon cas, puisque je cherchais surtout à intégrer les
RFCs elles-mêmes dans un lot de fichiers sources pour générer à la
vérification des dépendances des expressions régulières
qu'utiliseraient directement des sources C pour "inspirer confiance"
en employant une méthode simple et robuste (et sans pour autant créer
de dépendance externe à un énième interprète).

En pratique, vu l'usage souvent très limité que font les RFCs d'ABNF
(que je souhaitais éviter de devoir connaître), il sera certainement
possible de faire quelque chose de moins élégant dans ce cas
particulier, mais j'espérais bien ne pas avoir à le faire moi-même :-)


Un minimum de théorie des grammaires formelles est indispensable pour
faire un bon informaticien. Est ce que tu veux rester un
"utilisateur" toute ta vie?

--
__Pascal_Bourguignon__
http://www.informatimago.com/

Avatar
Laurent Wacrenier
Antoine Bellot écrit:
Merci pour l'ensemble des précisions que je n'aurais jamais pu trouver
seul du fait de mes lacunes académiques.


Bah, si tu essayes simplement de vérifier que tu as autant de
parenthèses fermantes que de parenthèses ouvrantes, tu vois que tu ne
peux pas le faire avec une expression rationelle :

A -> ( A ) | null

Avatar
Antoine Bellot
Pascal Bourguignon a écrit:

Un minimum de théorie des grammaires formelles est indispensable pour
faire un bon informaticien.


Trop tard pour devenir bon hélas : je suis déjà professionnel.


--
Antoine Bellot