حاليًا ، يمتد Perl مع Moose و Mouse و Moo و Mo وما شابه ذلك. تحتوي جميع هذه الوحدات على قاسم مشترك واحد - يتم إنشاء محددات السمات الخاصة بهم باستخدام has
. أعتقد أننا يمكن أن نفترض أن أي شيء يتبع اتفاقية موس التي وضعها ،
has $name|@$names => %options
هي سمة تم تشكيلها بشكل صحيح لأحد أنظمة بناء الكائنات العديدة الموجودة هناك.
سيتعين علينا تغطية أشياء مثل
has "foo" => ()
has ("foo" => ())
has [qw/foo bar/] => ()
has ([qw/foo bar/] => ())
dtikhonov ، هل يمكنك إلقاء نظرة على هذا؟
موس وآخرون. هي مجرد وحدات و has
هي استدعاء دالة ، وليست كلمة أساسية لـ Perl. إن تضمين دعم Moose في محلل ctags Perl من شأنه أن يضعنا على منحدر زلق ، حيث توجد العديد من وحدات Perl التي تقدم استدعاءات وظيفية تشبه الكلمات الرئيسية.
... أنا مهتم جدًا بهذا الموضوع. خلال السنوات الثلاث الماضية ، قمت بتحسين علامات ctags للتعامل مع DSLs.
راجع http://docs.ctags.io/en/latest/running-multi-parsers.html؟highlight=subparser#tagging -definitions-of-upper-level-language-sub-base حول رؤيتي.
يمكن تشغيل محلل موس في محلل 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 على كلمة أساسية "use" ، يقوم محلل Perl بإعلام الموزعين الفرعيين المسجلين بها.
محلل موس فرعي مثل هذا محلل فرعي.
ينشط محلل Moose نفسه إذا كان اسم الوحدة المبلغة هو "Moose".
يقوم الموزع الفرعي لـ Moose بمسح جدول الرموز الداخلي لـ ctags المسمى cork للعثور على كائن لغة Perl
تم وضع علامة "package" على النوع بواسطة محلل Perl. قد يجد محلل Moose الفرعي "Point" في جدول الرموز.
تم وضع علامة عليه بالفعل بواسطة المحلل اللغوي لـ Perl. ومع ذلك ، يقوم المحلل اللغوي Moose بعمل علامة جديدة لـ "Point" مع نوع "class" من لغة "Moose".
يدفع محلل Moose الفرعي "Point" إلى حزمة النطاق.
يعثر محلل Moose الفرعي على "has" ككلمة رئيسية. يقوم الموزع الفرعي لـ Moose بعمل علامة لـ "x" التي تم العثور عليها كرمز مميز تالي لـ "has". إنشاء علامة لـ "x" ، " النطاق: class : Point language: Moose " مرفق بـ "x" ...
حول محلل C ++ ، لقد قمت بالفعل بتنفيذ هذه الفكرة.
المحلل اللغوي الفرعي QtMoc مخصص لتحليل كود C ++ باستخدام Qt. يتعرف المحلل الفرعي QtMoc على الإشارة والفتحة ، والتي يتم تقديمها كلغة من لغة C ++.
لتنفيذ محلل فرعي ، يجب أن أحصل على إذن من المشرف على المحلل اللغوي الأساسي.
أعتقد أن dtikhonov ليس إيجابيًا جدًا لأن إدخال محلل فرعي يجعل كود محلل أساسي معقدًا.
إذا كان هناك تعارض بيني وبين مشرف المحلل اللغوي ، والذي يريد تقديم محلل فرعي إلى المحلل اللغوي ، فسأنسحب من تطبيق الموزع الفرعي لأن وجود مشرف محلل هو أهم شيء في مشروع u-ctags.
dtikhonov ، إذا كنت مهتمًا بفكرة تطبيق Moose كمحلل فرعي ، فأخبرني بذلك.
سأقوم بعمل نموذج أولي لإظهار التأثير على الكود المصدري لمحلل Perl.
شكرا لقرائتك.
أدرك أنها وظيفة ، تحت الغطاء. لكن هذه تفاصيل تنفيذية. بنفس المعنى ، الحزم هي "فئات" عندما تقوم بالبرمجة بطريقة كائنية التوجه ، و "Subs" هي طرق. تتغير كل هذه التسميات عند استخدام كائن الموجه بيرل ، ولكن في كل حالة يمكنك الاستفادة من المصطلحات غير OO. في جميع الحالات المذكورة أعلاه ، على الرغم من وجود تعقيدات إضافية في استنتاج النموذج الذي كتب المستخدم رمزه. ومع ذلك ، فإن كلمة "لديها" تفتقر إلى تلك التعقيدات. إذا رأيت أنه لديك تفسيران محتملان (أ) فأنت تستدعي دالة "لديها" وفي هذه الحالة يكون السلوك المطلوب هو عدم فعل أي شيء ، كما نفعل الآن ؛ أو ، (ب) أنك تستخدم إعلان سمة Moose-esque.
يوضح الاقتباس "Moose et al" من إجابتك مدى قوة هذا الاصطلاح في Perl لاستخدام أطر عمل إنشاء الوحدات (التي تتضمن إعلان السمات has
). يعد Moose بسهولة أحد أكثر الوحدات النمطية شيوعًا لـ Perl (يحتوي على عدد من النجوم على Metacpan أكثر من DBI و LWP).
أنا لا أقول أنه لا
masatake تبدو فكرة الموزع الفرعي أفضل وأكثر اكتمالاً من تطبيقي ، وقد قام بيرل بالفعل بشيء مماثل عن طريق الاختبار مقابل use
واستدعاء دلالات مختلفة لبعض هذه الوحدات داخليًا.
https://github.com/universal-ctags/ctags/blob/master/parsers/perl.c#L348
أعتقد أن المشكلة هناك هي أنه سيتعين عليك تعداد قائمة الوحدات التي تؤدي إلى تشغيل محلل Moose الذي لن يكون سيئًا للغاية. سيكون عليك أيضًا أن تفترض أنه لا يوجد أحد يدير فئة فرعية من Moose وهو أمر صعب ، ولكن إذا كانوا يفعلون ذلك ، فإن السيناريو الأسوأ هو أنهم سيفقدون محلل Moose الفرعي. وأنا موافق على ذلك - لن يكون الأمر أسوأ مما لديهم.
إذا كنت تريد مساعدة في كتابة محلل C لـ Moose ، فيمكنني المساعدة في ذلك أيضًا.
أنا على وشك أن أفكر في أن هذا النوع من المحلل اللغوي الثابت لـ Perl و Moose سيكون مفيدًا خارج ctags أيضًا. تحليل perl حاليًا غير آمن ، ولا توجد ضمانات. سيسمح هذا لمشاريع أخرى بإجراء تغطية اختبارية على Perl ، على سبيل المثال.
masatake ، يعد Perl 5 هدفًا بطيئًا بحيث لا يوجد الكثير للحفاظ عليه ، لذا فإن وظيفتي perl.c
كانت سهلة. لقد قمت بمسح وثائق الموزع الفرعي التي أشرت إليها - كل ما يمكنني قوله هو: رائع! لأكون صريحًا ، لم أتابع تطوير Universal Ctags عن كثب وأرى أنك قطعت خطوات كبيرة.
EvanCarroll ، محادثات الشفرة: لا تتردد في تجربة ذلك. أنا لست متزوجًا من perl.c
أيضًا. أجزاء منه قبيحة تمامًا ، وفي الإدراك المتأخر ، كان يجب تنفيذ بعض الأشياء بشكل مختلف. فيما يتعلق باستخدام "الاستخدام": لمس ، النقطة التي اتخذت.
رائع رائع. سأرى ما يمكنني إنجازه في نهاية هذا الأسبوع بعد ذلك. سوف أتحقق من العمل في إطار عمل الموزع الفرعي أيضًا.
نموذج أولي يعمل.
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.
كان هذا سريعا! 👍
تضمين التغريدة هل هناك المزيد من العمل للقيام به؟ أرى أنك نفذت findAttribute
ومرجع رد الاتصال للغة؟
تضمين التغريدة هل هناك المزيد من العمل للقيام به؟
هذا هو ما أود أن أعرفه :-).
إذا فاتني ما تريد ، من فضلك أعلمني.
قرأت فقط أجزاء قليلة من وثيقة موس.
masatake صفقة رائعة ، لقد راجعت التصحيح مع جيثب. إذا لم تتمكن من الالتفاف عليها ، فسوف ألقي نظرة في نهاية هذا الأسبوع. =) ولكن من المحتمل أن يتم ذلك في 0.0001 ثانية.
ولكن من المحتمل أن يتم ذلك في 0.0001 ثانية.
هذا غير صحيح.
لتحسين المحلل اللغوي ، نحتاج إلى 4 أشياء: المعرفة حول واجهة برمجة تطبيقات ctags الداخلية ، ومعرفة اللغة الهدف ، والموظ ، والوقت ، والشغف :-P.
ليس لدي معرفة عن الموظ. هذا هو الاهم
على سبيل المثال ، لا يلتقط المحلل اللغوي الحالي قاعدة مرتبطة بفصل بـ with
، ويتم تعريفه بـ "use Moose :: Rule". ما أعرفه هو فقط "القاعدة". ومع ذلك ، قد تعرف المزيد من العناصر التي يجب أن تلتقطها ctags.
ألا تتوقع أن تلتقط ctags مثل هذه القواعد؟
إذا تم إرفاق قاعدة بفصل ، أعتقد أن علامة الفصل يجب أن تحتوي على حقل باسم "القاعدة:
هذه الطلبات من شخص يعرف اللغة الهدف مطلوبة لتنمية هذا المشروع.
يمكنني تنفيذ بعضها. يمكنك تطبيق أخرى. يمكننا التنفيذ لاحقًا إذا كانت مثل هذه الطلبات.
يمكننا تمديد التنفيذ الحالي لدعم Mouse و Moo و Mo. يمكننا فعل أي شيء لك
تريد دون تعديل محلل Perl الأصلي.
آسف ، لقد وجدت أنك قدمت لي تعليقات مهمة في # 2070 بالفعل. شكرا لك.