Как маркировать исходный код Perl?

#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%.