Ctags: Запрос функции: Атрибуты Perl с (имеет)

Созданный на 31 мар. 2019  ·  14Комментарии  ·  Источник: universal-ctags/ctags

В настоящее время Perl расширен за счет Moose, Mouse, Moo, Mo и т.п. У всех этих модулей есть одна общая черта - их селекторы атрибутов устанавливаются с помощью has . Я считаю, что мы можем сделать предположение, что все, что следует установленному Музом соглашению,

has $name|@$names => %options - это правильно сформированный атрибут для одной из многих существующих систем построения объектов.

Нам нужно будет рассказать о таких вещах, как

has "foo" => ()
has ("foo" => ())
has [qw/foo bar/] => ()
has ([qw/foo bar/] => ())
Parser buenhancement

Все 14 Комментарий

@dtikhonov , можешь посмотреть на это?

Moose et al. являются просто модулями, а has - это вызов функции, а не ключевое слово Perl. Включение поддержки Moose в синтаксический анализатор ctags Perl поставит нас на скользкую дорожку, поскольку существует множество модулей Perl, которые вводят вызовы функций, которые выглядят как ключевые слова.

... Мне очень интересна эта тема. За последние 3 года я улучшил ctags для обработки DSL.

См http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-оф-более высокий верхнего уровень-язык-суб-базы о моем видении.

Подпарсер Moose может работать на парсере Perl.


package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

package Point3D;
use Moose;

extends 'Point';

has 'z' => (is => 'rw', isa => 'Int');

after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

Когда парсер Perl находит ключевое слово «использование», парсер Perl уведомляет его зарегистрированным субпарсерам.
Moose subparser - такой subparser.
Подпарсер Moose активируется, если имя уведомленного модуля - "Moose".
Подпарсер Moose сканирует внутреннюю таблицу символов ctags с именем cork, чтобы найти объект языка Perl.
помеченный парсером Perl вид "пакета". Подпарсер Moose может найти "Point" в таблице символов.
Он уже помечен парсером Perl. Однако синтаксический анализатор Moose создает новый тег для «Point» с «классом» на языке «Moose».

Подпарсер Moose помещает "Point" в стек области видимости.
Подпарсер Moose находит ключевое слово «has». Подпарсер Moose создает тег для «x», который является следующим токеном после «has». Создание тега для «x», « scope: class : Point language: Moose » прикрепляется к «x» ...

По поводу парсера C ++ я уже реализовал эту идею.
Подпарсер QtMoc предназначен для синтаксического анализа кода C ++ с использованием Qt. Подпарсер QtMoc распознает сигнал и слот, которые представлены как диалект языка C ++.

Чтобы реализовать субпарсер, мне нужно получить разрешение от сопровождающего его базового парсера.
Думаю, @dtikhonov не так уж

Если есть конфликт между сопровождающим парсера и мной, который хочет ввести субпарсер в синтаксический анализатор, я откажусь от реализации субпарсера, потому что наличие сопровождающего парсера является самым важным в проекте u-ctags.

@dtikhonov , если вас интересует идея реализовать Moose в качестве субпарсера, дайте мне знать.
Я сделаю прототип, чтобы показать влияние парсера Perl на исходный код.

Спасибо за чтение.

Я понимаю, что это функция, скрытая под капотом. Но это деталь реализации. В том же смысле пакеты - это «классы», когда вы программируете объектно-ориентированным способом, а «подпрограммы» - это методы. Вся эта номенклатура меняется, когда вы используете объектно-ориентированный perl, но в каждом случае вы можете использовать терминологию, отличную от объектно-ориентированной. Однако во всех вышеупомянутых случаях возникают дополнительные сложности при определении того, для какой парадигмы пользователь написал код. Тем не менее, «has» лишены этих сложностей. Если вы видите это, у вас есть две возможные интерпретации: (а) вы вызываете функцию «имеет», и в этом случае желаемое поведение будет заключаться в том, чтобы ничего не делать, как мы это делаем сейчас; или (б) вы используете объявление атрибута в стиле лося.

Цитата «Moose et al» из вашего ответа показывает, насколько сильна эта договоренность в Perl об использовании этих фреймворков для построения модулей (которые включают объявление has -attribute). Moose - один из самых популярных модулей для Perl (у него больше звезд на метакпанах, чем у DBI и LWP).

Я не говорю, что у нас не могло быть никаких ложных срабатываний, но я не знаю никого, кто опубликовал бы модуль, который не следует этому соглашению и поможет многим людям. Более того, я действительно сомневаюсь, что эти ctags теоретически правильны, а не просто практичны.

@masatake идея субпарсера звучит лучше и полнее, чем моя реализация, и perl на самом деле уже делает нечто подобное, тестируя use и вызывая внутри себя другую семантику для некоторых из этих модулей.

https://github.com/universal-ctags/ctags/blob/master/parsers/perl.c#L348

Думаю, проблема в том, что вам придется перечислить список модулей, запускающих Moose-parser, что было бы неплохо. Вы также должны предположить, что никто не запускает подкласс Moose, что будет сложно, но если бы они делали это, худший сценарий - они потеряли бы Moose-subparser. И я в порядке с этим - это было бы не хуже, чем то, что у них есть.

Если вам нужна помощь в написании синтаксического анализатора C для Moose, я тоже могу помочь.

Я почти уверен, что такой статический парсер для Perl и Moose будет полезен и вне ctags. В настоящее время парсинг perl небезопасен и нет никаких гарантий. Это позволит другим проектам безопасно запускать тестовое покрытие, например, на Perl.

@masatake , Perl 5 - настолько медлительная цель, что поддерживать perl.c была легкой. Я просмотрел документацию по второстепенному синтаксическому анализатору, на которую вы ссылались - все, что я могу сказать, это: вау! Честно говоря, я не следил внимательно за разработкой Universal Ctags и вижу, что вы добились больших успехов.

@EvanCarroll , переговоры по коду: не стесняйтесь perl.c . Некоторые из них просто уродливы, и, оглядываясь назад, некоторые вещи следовало реализовать по-другому. Что касается употребления слова "use": touch, point made.

Классно классно. Тогда я посмотрю, что я смогу сделать в эти выходные. Я также проверю работу над фреймворком subparser.

Опытный образец работает.
@EvanCarroll , вы можете начать с # 2070.

Я сосредотачиваюсь на парсере TypeScript. Так что я не буду какое-то время работать над # 2070.
Взламывайте как хотите.

[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% cat input.pl
cat input.pl
# Taken from https://metacpan.org/pod/Moose
package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

package Point3D;
use Moose;

extends 'Point';

has 'z' => (is => 'rw', isa => 'Int');

after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

no Moose;
package Line;

[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d%  ./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
 ./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
Point   ./input.pl  /^package Point;$/;"    package line:2  language:Perl
Point   ./input.pl  /^package Point;$/;"    class   line:2  language:Moose
x   ./input.pl  /^has 'x' => (is => 'rw', isa => 'Int');$/;"    attribute   line:5  language:Moose  class:Point
y   ./input.pl  /^has 'y' => (is => 'rw', isa => 'Int');$/;"    attribute   line:6  language:Moose  class:Point
clear   ./input.pl  /^sub clear {$/;"   subroutine  line:8  language:Perl
clear   ./input.pl  /^sub clear {$/;"   method  line:8  language:Moose  class:Point
Point3D ./input.pl  /^package Point3D;$/;"  package line:14 language:Perl
Point3D ./input.pl  /^package Point3D;$/;"  class   line:14 language:Moose  inherits:Point  end:26
z   ./input.pl  /^has 'z' => (is => 'rw', isa => 'Int');$/;"    attribute   line:19 language:Moose  class:Point3D
clear   ./input.pl  /^after 'clear' => sub {$/;"    attribute   line:21 language:Moose  class:Point3D
Line    ./input.pl  /^package Line;$/;" package line:27 language:Perl
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ./ctags --list-subparsers
./ctags --list-subparsers
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --list-subparsers
../../ctags --list-subparsers
#NAME                BASEPARSER        DIRECTIONS
AnsiblePlaybook      Yaml              base <> sub {bidirectional}
Autoconf             M4                base <> sub {bidirectional}
Automake             Make              base <= sub {dedicated}
ITcl                 Tcl               base <> sub {bidirectional}
JAXRS                Java              base => sub {shared}
LinuxKernel          C                 base => sub {shared}
LinuxOVS             C                 base => sub {shared}
Moose                Perl              base <> sub {bidirectional}
OpenVSwitch          C                 base => sub {shared}
PythonLoggingConfig  Iniconf           base <> sub {bidirectional}
PythonMain           Python            base => sub {shared}
PythonTuned          Python            base => sub {shared}
QtMoc                C++               base <> sub {bidirectional}
RSpec                Ruby              base => sub {shared}
SystemdUnit          Iniconf           base <= sub {dedicated}
TclOO                Tcl               base <> sub {bidirectional}
YumRepo              Iniconf           base <= sub {dedicated}
selinuxPolicy        selinuxPolicyBase base => sub {shared}
servlet              Java              base => sub {shared}
[yamato@slave]~/var/ctags/perl-moose% ./ctags --list-kinds-full=Moose   
#LETTER NAME      ENABLED REFONLY NROLES MASTER DESCRIPTION
a       attribute yes     no      0      NONE   attributes
c       class     yes     no      0      NONE   classes
m       method    yes     no      0      NONE   methods

Опытный образец работает. @EvanCarroll , вы можете начать с # 2070.

Это было быстро! 👍

@masatake впечатляет. Есть ли еще работа? Я вижу, вы реализовали findAttribute и ссылку на обратный вызов языка?

@masatake впечатляет. Есть ли еще работа?

Это то, что я хотел бы знать :-).
Если я пропустил то, что вы хотели, дайте мне знать.
Я прочитал только несколько частей документа Moose.

@masatake классная сделка, патч пересмотрел с github. Если у тебя не получится, я посмотрю в эти выходные. =) Но вы, вероятно, сделаете это за 0,0001 секунды.

Но вы, вероятно, сделаете это за 0,0001 секунду.

Это не правда.

Чтобы улучшить парсер, нам нужны 4 вещи: знание внутреннего API ctags, знание целевого языка, Moose, время и страсть :-P.

Я ничего не знаю о Лося. Это самый важный.
например, текущий синтаксический анализатор не захватывает правило, прикрепленное к классу с помощью with и определенное с помощью "use Moose :: Rule". Я знаю только «правило». Однако вы можете знать, что ctags должны захватывать больше элементов.

Разве вы не ожидаете, что ctags захватит такие правила?
Если к классу прикреплено правило, я думаю, что в теге этого класса должно быть поле с именем "rule:" поле.

Эти запросы от человека, знающего целевой язык, необходимы для развития этого проекта.

Некоторые из них я могу реализовать. Вы можете реализовать другие. Мы можем реализовать позже, если такие запросы будут.

Мы можем расширить текущую реализацию для поддержки Mouse, Moo и Mo. Мы можем сделать все, что вы
хотите БЕЗ изменения исходного парсера Perl.

Извините, я обнаружил, что вы уже давали мне важные комментарии в # 2070. Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги