Получение QAST файла Perl 6 из другой программы

Это связано с этот вопрос о доступе к 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 и, вероятно, в зависимости от Ракудо. Кто-нибудь знает, горячо идет?

Насколько я понимаю, к моменту появления файла precomp все, что находится в нем, является байтовым представлением MAST, а не QAST. Возможно, девять (Стефан Зайферт) расскажут об этом больше, поскольку он недавно реорганизовал процесс QAST -> MAST.

Elizabeth Mattijsen 17.12.2018 11:43

@elizabethMattijsen Большое спасибо. Главное здесь - я пытаюсь извлечь POD из файлов, не запуская файлы. Я бы хотел сократить QAST операций и получить только неисполняемые части, как бы «дезинфицируя» их.

jjmerelo 17.12.2018 11:47
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
5
2
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку QAST не является частью спецификации языка Perl 6, а является деталью внутренней реализации Rakudo, официального способа сделать это не существует. В конце концов появится форма AST, которая является частью спецификации языка, но ее еще не существует (проект 007, который работает над изучением этой области).

Однако можно получить дерево QAST, используя:

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

Вернемся к исходной проблеме: получение только POD-части синтаксического дерева (может быть что угодно, например, зависимости) без запуска кода. Есть ли лучший способ сделать это?

jjmerelo 17.12.2018 12:32

Не то, чтобы я знал об этом, и обратите внимание, что то, что я показал, по-прежнему будет запускать операторы use, блоки BEGIN, мета-объектный код и т. д. Если вы действительно не хотите запускать код, тогда невозможно иметь 100% решение, но 99% -ным решением будет синтаксический анализатор, который делает некоторые предположения / догадки, чтобы просто извлечь части документа Pod.

Jonathan Worthington 17.12.2018 13:21

Можно ли, например, разобрать грамматику Perl 6, чтобы получить только часть POD6?

jjmerelo 18.12.2018 06:41

Вероятно, проще всего было бы украсть правила грамматики для их синтаксического анализа в программе Perl 6 и настроить их по мере необходимости, чтобы они работали независимо. Тем не менее, вам все равно нужно будет найти Pod, но это, вероятно, можно сделать с помощью простой эвристики (просто найдите строку, начинающуюся с /^^ \h* '='/ или около того).

Jonathan Worthington 18.12.2018 10:58

Другие вопросы по теме