Ctags: PHP heredoc (<<

تم إنشاؤها على ٢٠ نوفمبر ٢٠٢٠  ·  8تعليقات  ·  مصدر: universal-ctags/ctags

ملخص:

يتوقف إنشاء العلامات عند مصادفة بناء جملة PHP heredoc ( <<< ) في ملف. نظرًا لأن بناء الجملة nowdoc PHP هو نفسه بشكل أساسي ، فهذا عنصر لغة آخر يكسر تحليل الملف.

اسم المحلل اللغوي:

لست متأكدا من هذا. بافتراض PHP

سطر الأوامر الذي استخدمته لتشغيل ctags:
$ ctags --options=NONE foo.php
محتوى ملف الإدخال:
<?php

class LivingBeings {

    public function doSomething()
    {
        $foo = <<<FOO
        FOO;
    }

    public function doSomethingElse()
    {
    }
}
ناتج العلامات الذي لست راضيًا عنه:

طريقة doSomethingElse غير مدرجة في الملف. بمجرد أن أعلق على الجزء heredoc ، تتم فهرسة الطريقة بشكل طبيعي ، كما ترى في قسم "الإخراج المتوقع" مسبقًا.

!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combine/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /tmp/   //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   5.9.0   /5a136315/
LivingBeings    foo.php /^class LivingBeings {$/;"  c
doSomething foo.php /^    public function doSomething()$/;" f   class:LivingBeings
إخراج العلامات الذي تتوقعه:
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combine/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /tmp/   //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   5.9.0   /5a136315/
LivingBeings    foo.php /^class LivingBeings {$/;"  c
doSomething foo.php /^    public function doSomething()$/;" f   class:LivingBeings
doSomethingElse foo.php /^    public function doSomethingElse()$/;" f   class:LivingBeings
إصدار ctags:
$ ctags --version
Universal Ctags 5.9.0(5a136315), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov 20 2020, 11:46:20
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +yaml, +packcc
كيف تحصل على ثنائي ctags:

بنائه محليا:

$ cd ctags_source
$ make clean && make distclean
$ ./autogen.sh
$ ./configure --prefix=$HOME
$ make
$ make install
Parser buenhancement

ال 8 كومينتر

jespinal ، هل تتحدث عن هذا التغيير: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes ؟

$ git diff |cat
git diff |cat
diff --git a/parsers/php.c b/parsers/php.c
index e3fdc241..ace25561 100644
--- a/parsers/php.c
+++ b/parsers/php.c
@@ -682,6 +682,8 @@ static void parseHeredoc (vString *const string)
            int extra = EOF;

            c = getcFromInputFile ();
+           if (c == ' ' || c == '\t')
+               c = getcFromInputFile ();
            for (len = 0; c != 0 && (c - delimiter[len]) == 0; len++)
                c = getcFromInputFile ();

$ cat input.php
cat input.php
<?php
// Taken from https://github.com/universal-ctags/ctags/issues/2717
// submitted by <strong i="5">@jespinal</strong>
class LivingBeings {

    public function doSomething()
    {
        $foo = <<<FOO
        FOO;
    }

    public function doSomethingElse()
    {
    }
}
$ u-ctags -o - input.php
u-ctags -o - input.php
LivingBeings    input.php   /^class LivingBeings {$/;"  c
doSomething input.php   /^    public function doSomething()$/;" f   class:LivingBeings
$

masatake هذا ليس كافيًا ، لأن علامة النهاية كانت في السابق يجب أن تكون على سطر خاص بها ، بينما يرفع الإصدار الجديد هذا التقييد. لا أجد الشرح واضحا جدا:

يتجنب التطبيق الذي أقترحه هذه المشكلة عن طريق التحقق لمعرفة ما إذا كان هناك استمرار للعلامة التي تم العثور عليها ، وإذا كان الأمر كذلك ، فعندئذ إذا كان يشكل معرفًا صالحًا.

لكنني أقول أن هذا يعني أنه ما لم يكن هناك حرف معرف بعد السطر مسبوقًا بعلامة النهاية ، فهو بالفعل علامة إنهاء. لذا فإن END; هو إنهاء (نظرًا لأن العلامة هي END ) ، لكن ENDFOO ليس كذلك.

راجع للشغل ، نظرًا لأن هذا تغيير نحوي غير متوافق للخلف ، لا أعرف ما الذي نريد فعله حيال ذلك. لكنني أعتقد أنه إذا كانت PHP سعيدة بكسرها ، فيمكننا ذلك أيضًا ، خاصة أنه من غير المحتمل إلى حد ما أن تسبب مشكلة. من الناحية المثالية ، أعتقد أننا سنستخدم الصيغة الحالية لـ *.php[1-6] والصيغة الجديدة للبقية ، لكن هذا قد يكون مشكلة كبيرة بالنسبة لما يستحق.

jespinal ، هل تتحدث عن هذا التغيير: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes ؟

عذرًا ، masatake ، لسبب ما لم يتم

نعم ، أنا أتحدث عن هذا التغيير. ولكن تم تطبيق ذلك بالفعل في PHP 7.3 (الإصدار الثابت الحالي هو 7.4 ، والإصدار 8 في متناول اليد). لست متأكدًا من سبب عدم الإبلاغ عن ذلك مسبقًا مع الأخذ في الاعتبار قاعدة المستخدمين الواسعة لكل من ctags و PHP.

أقوم بإضافة بعض لقطات الشاشة لمقتطفات التعليمات البرمجية المستمدة من المثال السابق من أجل (نأمل) إلقاء بعض الضوء على ما يعتبرونه بناء جملة صالحًا / غير صالح فيما يتعلق ببنية heredoc / nowdoc الجديدة (RFC ليس واضحًا بدرجة كافية ، I فكر في).

في هذا المثال ، " TEXT " (الثاني) هو علامة النهاية. لذا ، فإن العنصر الثالث ' TEXT; عبارة عن سلسلة غير صالحة من الناحية النحوية في عرض المحلل اللغوي ، حيث يتوقع فقط فاصلة منقوطة أو فاصلة:

test-001-2020-11-24 22-33-30

حالة مماثلة للحالة السابقة:
test-003-2020-11-24 22-37-04

لو كانت فاصلة منقوطة أو فاصلة ، لكان محلل php سعيدًا. على سبيل المثال

        echo <<<TEXT
            some string 
        TEXT, 'some other string';

في نظر المحلل اللغوي ، هذا هو نفسه:

    echo 'some string', 'some other string';

المثال التالي هو مثال صالح ، حيث يعلم المحلل اللغوي أن ' TEXT ' و ' TEXTUAL ' هما سلسلتان مختلفتان:

test-002-2020-11-24 22-36-25

إليك بعض المقتطفات غير الصالحة بسبب المسافة البادئة الخاطئة. على وجه التحديد ، بالنسبة إلى عبارة RFC: "إذا تم وضع مسافة بادئة لعلامة الإغلاق أكثر من أي سطور من الجسم ، فسيتم طرح ParseError:"

test-004-2020-11-24 22-38-11

test-005-2020-11-24 22-39-38

jespinal شكرًا ، ولكن إذا كان لديك نص معياري رابطmasatake ومعلوماتك: +1:

masatake لا أعدك بأي شيء بالنظر إلى الوقت القليل الذي أجده مؤخرًا ، لكنني سأحاول إلقاء نظرة على هذا قريبًا ما لم - لقد

راجع للشغل jespinal إذا لم يشتكي أحد ، أعتقد حقًا أنه بسبب وجود القليل جدًا من استخدام هذه البنية ، ونحن ندعم بناء الجملة قبل 7.3 ، لذا فإن الحالات الوحيدة التي قد يرى المرء فيها مشكلة هي استخدام بناء الجملة 7.3+ ، مما يعني استخدام neredoc / nowdoc في المقام الأول :)

كنت غير نشط لفترة من الوقت. لذلك لم أتوقع تلقي تعليق منك.
ولكن ، الآن نحصل على علامة "المخصصة ذاتيًا" منك. @ b4n ، شكرًا لك على العرض.

masatake لقد كنت حكيماً ألا تتوقع الكثير مني ، لأنني في الواقع لم أجد وقتًا للكثير من مساهمات UCtags / Geany مؤخرًا: محبط:. أحاول العثور على كيفية تخصيص الوقت هنا مرة أخرى ، لذلك آمل أن أكون أكثر نشاطًا مرة أخرى ، لكن لا يمكنني أن أعدك الآن.

ومع ذلك ، راجع # 2734 لإصلاح المشكلة المطروحة :)

شكرا لك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات