【问题标题】:Obtaining the QAST of a Perl 6 file from another program从另一个程序获取 Perl 6 文件的 QAST
【发布时间】:2018-12-17 09:51:55
【问题描述】:

这与this question on accesing the POD 有关,但不止于此。你可以easily access the Abstract Syntax Tree of a Perl 6 program 使用:

perl6 --target=ast -e '"Þor is mighty!".say'

这将打印整个 Q 抽象语法树。目前还不太清楚如何从您自己的程序中制作这个,或者我还没有找到如何做到这一点。事实上,the CoreHackers::Q module 将其作为外部脚本运行。但是能够从您自己的程序中访问它,例如

use QAST; # It does not exist
my $this-qast = QAST::Load("some-external-file.p6") # Would want something like this

会很棒。我很确定这应该是可能的,在 NQP 级别并且可能以 Rakudo 依赖的方式。有人知道它很热吗?

【问题讨论】:

  • 据我了解,当有一个 precomp 文件时,其中的任何内容都是 MAST 的字节表示,而不是 QAST。也许九位(Stefan Seifert)可以详细说明这一点,因为他最近重构了 QAST -> MAST 流程。
  • @elizabethMattijsen 非常感谢。这里的主要内容是我试图在不实际运行文件的情况下从文件中提取 POD。我想要的是修剪操作的 QAST,只获取不可执行的部分,对它进行“清理”。

标签: abstract-syntax-tree raku rakudo nqp


【解决方案1】:

由于 QAST 不是 Perl 6 语言规范的一部分,而是 Rakudo 的内部实现细节,因此没有官方的方法可以做到这一点。最终会有一个 AST 形式,它是语言规范的一部分,但目前还不存在(007 项目正在探索这个领域)。

但是,可以使用以下方法获取 QAST 树:

use nqp;
my $ast = nqp::getcomp("perl6").eval("say 42", :target<ast>);
say $ast.dump();

【讨论】:

  • 让我们回到最初的问题:只获取语法树的 POD 部分(可以是其他任何东西,比如我们说的依赖项)无需运行任何代码。有没有更好的方法?
  • 我不知道,请注意我展示的内容仍将运行use 语句、BEGIN 块、元对象代码等。如果您真的不想运行代码,那么不可能有 100% 的解决方案,但 99% 的解决方案将是一个解析器,它会做出一些假设/猜测以仅提取文档的 Pod 部分。
  • 例如,是否有可能拆分 Perl 6 语法以仅获取 POD6 部分?
  • 可能最简单的方法是窃取用于将其解析为 Perl 6 程序并根据需要调整它们以独立工作的语法规则。不过,您仍然需要找到 Pod,但这可能可以通过简单的启发式方法来完成(只需查找以 /^^ \h* '='/ 左右开头的行)。
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2014-07-08
  • 2016-02-20
  • 2011-12-28
  • 2017-06-27
  • 2015-07-02
相关资源
最近更新 更多