解析 Perl 5 并检查语法树
Parsing Perl 5 and examining the syntax tree
我已经阅读并了解到,由于 BEGIN
块,没有 Perl 解释器就无法解析 Perl 5 代码。
我知道有独立的解析器,比如
PPI
(被 Perl::Critic
使用)
大致解析初始文档。
但是我找不到任何关于输出某种程序的参考
抽象语法树,或 Perl 在 执行 阶段使用的类似于树的任何内部结构。
比较解析和执行阶段的内部表示以查看代码扩展和更改会很有趣。
所以基本上有几个选项:
对于静态分析,使用 PPI,其缺点是无法在 BEGIN
块处处理 Perl 代码。这类似于 "parsing".
动态分析,使用Use B::Concise获取执行时使用的内部操作码。这类似于 "compiling"(对于 Perl VM)。
两者的组合将使用 B::Deparse 来获取内部表示的 Perl 代码(而不是 VM 操作码),然后发送它PPI 用于构建树。
编辑:根据评论澄清了第 3 点。仍然不知道可以扩展导入并输出单个大文件的命令(以便解析语法扩展)。
我已经阅读并了解到,由于 BEGIN
块,没有 Perl 解释器就无法解析 Perl 5 代码。
我知道有独立的解析器,比如
PPI
(被 Perl::Critic
使用)
大致解析初始文档。
但是我找不到任何关于输出某种程序的参考 抽象语法树,或 Perl 在 执行 阶段使用的类似于树的任何内部结构。
比较解析和执行阶段的内部表示以查看代码扩展和更改会很有趣。
所以基本上有几个选项:
对于静态分析,使用 PPI,其缺点是无法在
BEGIN
块处处理 Perl 代码。这类似于 "parsing".动态分析,使用Use B::Concise获取执行时使用的内部操作码。这类似于 "compiling"(对于 Perl VM)。
两者的组合将使用 B::Deparse 来获取内部表示的 Perl 代码(而不是 VM 操作码),然后发送它PPI 用于构建树。
编辑:根据评论澄清了第 3 点。仍然不知道可以扩展导入并输出单个大文件的命令(以便解析语法扩展)。