Question

J'écris un lexer jFlex pour Lua et je ne parviens pas à concevoir une expression régulière pour correspondre à une partie particulière de la spécification de langue:

  

Les chaînes littérales peuvent également être définies à l'aide d'un format long entouré de crochets longs. Nous définissons une parenthèse ouvrante de niveau n comme étant un crochet ouvrant suivi de n signes égaux suivis d'un autre crochet ouvert. Ainsi, une longue parenthèse d'ouverture de niveau 0 est écrite comme [[, une parenthèse d'ouverture de niveau 1 est écrite comme [= [, et ainsi de suite. Un crochet long fermant est défini de la même manière; par exemple, un crochet long du niveau 4 est écrit] ====]. Une longue chaîne commence par un long crochet ouvrant de tout niveau et se termine par le premier long crochet fermant du même niveau. Les littéraux de cette forme entre crochets peuvent être exécutés sur plusieurs lignes, n'interprètent aucune séquence d'échappement et ignorent les crochets longs d'un autre niveau. Ils peuvent contenir n'importe quoi sauf un crochet de fermeture du bon niveau.

En résumé, j'essaie de concevoir une expression régulière qui corresponde à un crochet long qui s'ouvre, au contenu de la chaîne entre les deux et au crochet long qui ferme. Une correspondance ne doit se produire que lorsque le support long d’ouverture et le support long de fermeture ont le même nombre de signes identiques, ce qui peut être zéro ou plus.

Était-ce utile?

La solution

\[(=*)\[.*?\]\1\]

le \ 1 capture le premier ().

Autres conseils

Eh bien, j’ai bien peur que la syntaxe avec des expressions régulières ne soit pas suffisante pour cette tâche. Les expressions régulières ne sont tout simplement pas assez puissantes.

Il n’existe aucun moyen de comparer le nombre de marques '=' en utilisant des expressions régulières simples dans jFlex. Perl aurait un hack pour cela (\ 1 comme suggéré ci-dessus), mais nous ne parlons pas de la programmation Perl, mais de lexer jFlex.

La solution consiste à utiliser \ [= * \ [pour le jeton d'accolade gauche, \] = * \] pour le jeton d'accolade droit, puis dans le calque situé au-dessus (analyseur), comparez-les s'ils ont une longueur identique.

Quoi qu'il en soit, vous pouvez regarder read_long_string () dans le code source de Lua dans llex.c et voir comment ils l'ont fait sans utiliser d'expressions régulières.

\[(=*)\[.*?\]\1\]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top