如何标记Perl源代码?

pts*_*pts 7 perl tokenize

我有一些合理的(没有混淆的)Perl源文件,我需要一个tokenizer,它会将它拆分为令牌,并返回每个令牌的令牌类型,例如脚本

print "Hello, World!\n";
Run Code Online (Sandbox Code Playgroud)

它会返回这样的东西:

  • 关键字5个字节
  • 空格1个字节
  • 双引号字符串17个字节
  • 分号1个字节
  • 空格1个字节

哪个是最好的库(最好用Perl编写)呢?它必须是合理正确的,即它应该能够解析语法结构qq{{\}}},但它不必知道像Lingua :: Romana :: Perligata这样的特殊解析器.我知道解析Perl是Turing-complete,并且只有Perl本身才能正确完成,但我不需要绝对的正确性:tokenizer可能会失败或不兼容或在某些非常罕见的极端情况下假设某些默认值,但它应该工作大部分时间都是正确的.它必须比普通文本编辑器中内置的语法高亮更好.

仅供参考我在pygments中尝试了PerlLexer ,这对于大多数构造都是合理的,除了它print在这一个中找不到第二个关键字:

print length(<<"END"); print "\n";
String
END
Run Code Online (Sandbox Code Playgroud)

szb*_*int 7

use PPI;

是的,只有perl可以解析Perl,但PPI是95%正确的解决方案.