Это связано с этот вопрос о доступе к POD, но идет дальше этого. Вы можете легко получить доступ к абстрактному синтаксическому дереву программы Perl 6 использовать:
perl6 --target=ast -e '"Þor is mighty!".say'
Это напечатает все абстрактное синтаксическое дерево Q. Не слишком понятно, как это сделать из вашей собственной программы, или я не нашел, как это сделать. Фактически, модуль CoreHackers::Q
запускает это как внешний скрипт. Но возможность получить к нему доступ из собственной программы, например
use QAST; # It does not exist
my $this-qast = QAST::Load("some-external-file.p6") # Would want something like this
было бы замечательно. Я почти уверен, что это должно быть возможно на уровне NQP и, вероятно, в зависимости от Ракудо. Кто-нибудь знает, горячо идет?
@elizabethMattijsen Большое спасибо. Главное здесь - я пытаюсь извлечь POD из файлов, не запуская файлы. Я бы хотел сократить QAST операций и получить только неисполняемые части, как бы «дезинфицируя» их.
Поскольку 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* '='/
или около того).
Насколько я понимаю, к моменту появления файла precomp все, что находится в нем, является байтовым представлением MAST, а не QAST. Возможно, девять (Стефан Зайферт) расскажут об этом больше, поскольку он недавно реорганизовал процесс QAST -> MAST.