J'essaie d'écrire une grammaire ANTLR pour le format PHP serialize(), et tout semble fonctionner correctement, sauf pour les chaînes. Le problème est que le format des chaînes sérialisés est:Règle ANTLR pour consommer un nombre fixe de caractères
s:6:"length";
En termes de regexes, une règle comme s:(\d+):".{\1}";
décriraient ce format si seulement les références arrières ont été autorisés dans le « nombre de correspondances » count (mais ils ne sont pas) . Mais je ne peux pas trouver un moyen d'exprimer cela pour une grammaire de syntaxe ou de syntaxe: l'idée est de faire dépendre le nombre de caractères lus d'une référence arrière décrivant le nombre de caractères à lire, comme dans les constantes de Fortran Hollerith (c'est-à-dire 6HLength
), pas sur un délimiteur de chaîne.
Cet exemple du ANTLR grammar for Fortran semble pointer le chemin, mais je ne vois pas comment. Notez que ma langue cible est Python, alors que la plupart des doc et des exemples sont pour Java:
// numeral literal
ICON {int counter=0;} :
/* other alternatives */
// hollerith
'h' ({counter>0}? NOTNL {counter--;})* {counter==0}?
{
$setType(HOLLERITH);
String str = $getText;
str = str.replaceFirst("([0-9])+h", "");
$setText(str);
}
/* more alternatives */
;