Je suis en train d'écrire un petit programme (en fait un interprêteur) et pour ce faire, j'ai besoin de détecter facilement si un string est valide dans ce langage.

Voici le langage en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
X = [a-z0-9]
L = lambda X ° U
U = (U)U
Aucun problème avec X et L.

Ce n'est pas le cas de U.
(f)x avec f et x appartenant à X ne pose aucun problème.

En effet, si j'utilise cette expression régulière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
^\s*\(\s*(?<u>.+)\s*\)(?<v>.+)\s*
alors je me retrouve avec le problème suivant :
(f)(f)x devient f)(f et x.
Et évidemment f)(f est illégal dans ce langage.

Si j'utilise cette expression régulière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
^\s*\(\s*(?<u>.+?)\s*\)(?<v>.+)\s*
alors je me retrouve avec :
((f)f)x qui devient (f et f)x qui sont tous les deux illégaux.

Bref, existe-il un moyen efficace en utilisant une expression régulière de résoudre de problème ou bien ferais-je mieux de scanner les caractères un à un en comptant les parenthèses ouvrantes/fermantes ?