#perl #tokenize
#perl #маркировать
Вопрос:
У меня есть несколько разумных (не запутанных) исходных файлов Perl, и мне нужен токенизатор, который разделит его на токены и вернет тип токена каждого из них, например, для скрипта
print "Hello, World!n";
это вернет что-то вроде этого:
- ключевое слово 5 байт
- пробел в 1 байт
- строка в двойных кавычках — 17 байт
- точка с запятой 1 байт
- пробел в 1 байт
Какая библиотека (предпочтительно написанная на Perl) для этого является лучшей? Он должен быть достаточно корректным, т. Е. он должен уметь анализировать синтаксические конструкции типа qq{{}}}
, но ему не обязательно знать о специальных анализаторах, таких как Lingua::Romana::Perligata. Я знаю, что синтаксический анализ Perl выполняется по Тьюрингу, и только сам Perl может сделать это правильно, но мне не нужна абсолютная корректность: токенизатор может выйти из строя, быть несовместимым или принимать какое-то значение по умолчанию в некоторых очень редких угловых случаях, но большую часть времени он должен работать корректно. Это должно быть лучше, чем подсветка синтаксиса, встроенная в обычный текстовый редактор.
К вашему сведению, я попробовал PerlLexer в pygments, который работает разумно для большинства конструкций, за исключением того, что он не может найти 2-е print
ключевое слово в этой:
print length(<<"END"); print "n";
String
END
Ответ №1:
Ответ №2:
use PPI;
Да, только perl может анализировать Perl, однако PPI — это правильное решение на 95%.