Я пытаюсь написать грамматику ANTLR для формата PHP serialize(), и все работает нормально, кроме строк. Проблема в том, что формат сериализованных строк:
s:6:"length";
С точки зрения регулярных выражений, такое правило, как s:(\d+):".{\1}";
, описывало бы этот формат, если бы в подсчете «количества совпадений» были разрешены только обратные ссылки (но это не так).
Но я не могу найти способ выразить это ни для грамматики лексера, ни для синтаксического анализатора: вся идея состоит в том, чтобы количество прочитанных символов зависело от обратной ссылки, описывающей количество прочитанных символов, как в константах Фортрана Холлерита (т.е. 6HLength
), не на разделителе строк.
Этот пример из грамматики ANTLR для Fortran, кажется, указывает путь, но Я не понимаю, как. Обратите внимание, что мой целевой язык — Python, в то время как большая часть документации и примеров предназначена для 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 */
;