Ctags: Ada: рдЦрд░рд╛рдм рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рджрд┐рд╕ре░ 2019  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: universal-ctags/ctags

рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдирд╛рдо: рд╣реЛрдордмреНрд░реЙ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд╕реАрдЯреАрдЬреА

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЬрд┐рд╕реЗ рдЖрдк ctags рдЪрд▓рд╛рддреЗ рдереЗ:

$ ctags --options=NONE src/carte/tasche/carte_p-tasche_p.ads

рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА:

--  <strong i="10">@summary</strong>
--  Impl├йmentation par une t├вche.
--  <strong i="11">@description</strong>
--  Impl├йmentation par une tache de la classe synchronis├й.
--  <strong i="12">@group</strong> Version t├вche
package Carte_P.Tasche_P
   with
      Pure           => False,
      Preelaborate   => False,
      Elaborate_Body => True,
      Spark_Mode     => Off
is

   ---------------------------------------------------------------------------
   task type Tasche_T is new Carte_T with
   --  Impl├йmentation par une t├вche de l'interface Carte_T.

      -----------------------------------
      overriding
      entry Coucou;
      --  Impl├йmentation par un accept.

      -----------------------------------
      --  overriding
      --  entry Inutile;
      --  Impl├йmentation par un accept.
      --  <strong i="13">@param</strong> This
      --  La carte.
   end Tasche_T;
   ---------------------------------------------------------------------------

   overriding
   procedure Inutile
      (This : in out Tasche_T);
   --  Impl├йmentation par une proc├йdure.
   --  <strong i="14">@param</strong> This
   --  La carte.

end Carte_P.Tasche_P;

рдЯреИрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЖрдк рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ:

!_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_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_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   0.0.0   /e216bb4/
(This   src/carte/tasche/carte_p-tasche_p.ads   /^      (This : in out Tasche_T);$/;"   v   packspec:Carte_P.Tasche_P
Carte_P.Tasche_P    src/carte/tasche/carte_p-tasche_p.ads   /^package Carte_P.Tasche_P$/;"  P
Inutile src/carte/tasche/carte_p-tasche_p.ads   /^   procedure Inutile$/;"  v   packspec:Carte_P.Tasche_P
Tasche_T    src/carte/tasche/carte_p-tasche_p.ads   /^   task type Tasche_T is new Carte_T with$/;" K   packspec:Carte_P.Tasche_P
overriding  src/carte/tasche/carte_p-tasche_p.ads   /^   overriding$/;" v   packspec:Carte_P.Tasche_P
procedure   src/carte/tasche/carte_p-tasche_p.ads   /^   procedure Inutile$/;"  v   packspec:Carte_P.Tasche_P

overriding , procedure рдЪрд░ рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИрдВ, рдХреАрд╡рд░реНрдб рд╣реИрдВред
Inutile рдПрдХ рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд╛рдо рд╣реИред
(This рд╕рдмрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рддрд░реНрдХ рд╣реИред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ Coucou рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЯреИрдЧ рдЖрдЙрдЯрдкреБрдЯ:

!_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_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_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   0.0.0   /e216bb4/
Carte_P.Tasche_P    src/carte/tasche/carte_p-tasche_p.ads   /^package Carte_P.Tasche_P$/;"  P
Inutile src/carte/tasche/carte_p-tasche_p.ads   /^   procedure Inutile$/;"  R   packspec:Carte_P.Tasche_P
Tasche_T    src/carte/tasche/carte_p-tasche_p.ads   /^   task type Tasche_T is new Carte_T with$/;" K   packspec:Carte_P.Tasche_P
Coucou           src/carte/tasche/carte_p-tasche_p.ads  e         task:Tasche_T

Capture dтАЩe╠Бcran 2019-12-18 a╠А 12 13 43

рдЗрд╕реА рд╢рд░реАрд░:

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЬрд┐рд╕реЗ рдЖрдк ctags рдЪрд▓рд╛рддреЗ рдереЗ:

$ ctags --options=NONE src/carte/tasche/carte_p-tasche_p.adb

рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА:

with Ada.Text_IO;

package body Carte_P.Tasche_P
   with Spark_Mode => Off
is

   ---------------------------------------------------------------------------
   task body Tasche_T is
      --  Les d├йclarations qui vont bien.
   begin
      accept Coucou do
         null;
      end Coucou;

      Ada.Text_IO.Put_Line (Item => "Wesh gros je suis une t├вche");

      --  accept Inutile do
      --     null;
      --  end Inutile;
      abort Tasche_T;
   end Tasche_T;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   overriding
   procedure Inutile
      (This : in out Tasche_T)
   is
   begin
      null;
   end Inutile;
   ---------------------------------------------------------------------------

end Carte_P.Tasche_P;

рдЯреИрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдЖрдк рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ:

!_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_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_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   0.0.0   /e216bb4/
(This   src/carte/tasche/carte_p-tasche_p.adb   /^      (This : in out Tasche_T)$/;"    v   package:Carte_P.Tasche_P    file:
Carte_P.Tasche_P    src/carte/tasche/carte_p-tasche_p.adb   /^package body Carte_P.Tasche_P$/;" p
Coucou  src/carte/tasche/carte_p-tasche_p.adb   /^      accept Coucou do$/;"    e   task:Tasche_T   file:
Inutile src/carte/tasche/carte_p-tasche_p.adb   /^   procedure Inutile$/;"  v   package:Carte_P.Tasche_P    file:
Tasche_T    src/carte/tasche/carte_p-tasche_p.adb   /^   task body Tasche_T is$/;"  k   package:Carte_P.Tasche_P    file:
overriding  src/carte/tasche/carte_p-tasche_p.adb   /^   overriding$/;" v   package:Carte_P.Tasche_P    file:
procedure   src/carte/tasche/carte_p-tasche_p.adb   /^   procedure Inutile$/;"  v   package:Carte_P.Tasche_P    file:

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЯреИрдЧ рдЖрдЙрдЯрдкреБрдЯ:

!_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_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_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   0.0.0   /e216bb4/
Carte_P.Tasche_P    src/carte/tasche/carte_p-tasche_p.adb   /^package body Carte_P.Tasche_P$/;" p
Coucou  src/carte/tasche/carte_p-tasche_p.adb   /^      accept Coucou do$/;"    e   task:Tasche_T   file:
Inutile src/carte/tasche/carte_p-tasche_p.adb   /^   procedure Inutile$/;"  r   package:Carte_P.Tasche_P    file:
Tasche_T    src/carte/tasche/carte_p-tasche_p.adb   /^   task body Tasche_T is$/;"  k   package:Carte_P.Tasche_P    file:

Capture dтАЩe╠Бcran 2019-12-18 a╠А 12 12 47

Ctags рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг:

$ ctags --version
Universal Ctags 0.0.0(e216bb4), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Dec 18 2019, 11:28:07
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-insensitive-filenames, +packcc

рдЖрдк ctags рдмрд╛рдЗрдирд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдордмреНрд░реЗред

Parser buenhancement

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ "рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ" рдФрд░ "рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдирд╣реАрдВ" рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреЗрд╢ рдХрд┐рдпрд╛ред # 2383 рджреЗрдЦреЗрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, Ada parser рдЕрднреА рднреА рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЗрдирдкреБрдЯ рдореЗрдВ "Coucou" рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рддрдм рднреА рд╕рдЪ рд╣реИ рдЬрдм рдореИрдВ рдЗрдирдкреБрдЯ рд╕реЗ "рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ" рд╕рдВрдХреЗрддрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЖрдкрдХреА рдорджрдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Coucou рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмреНрд▓реЙрдХ https://en.wikibooks.org/wiki/Ada_Programming/Tasking#Interfaces рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдБ?

рд╣рд╛рдВ, рдпрд╣ рд╕рд╣реА рд╣реИ, рдФрд░ рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рдирд┐рд░реНрджреЗрд╢ (.ads) рдореЗрдВ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдп:

   task Tasche_T is
      entry Coucou
         (Parameters : Parameters_Type);
   end Tasche_T;

рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░:

   task type Tasche_T is
      entry Coucou
         (Parameters : Parameters_Type);
   end Tasche_T;
[jet@living]~/var/ctags% git diff | cat
git diff | cat
diff --git a/parsers/ada.c b/parsers/ada.c
index 22a7dc01..73b4a458 100644
--- a/parsers/ada.c
+++ b/parsers/ada.c
@@ -929,7 +929,9 @@ static adaTokenInfo *adaParseBlock(adaTokenInfo *parent, adaKind kind)
       else if(adaKeywordCmp(ADA_KEYWORD_NEW))
       {
         /* if this is a "new" something then no need to parse */
-        skipPast(";");
+        // skipPast(";");
+       skipPastKeyword(ADA_KEYWORD_WITH);
+       adaParse(ADA_DECLARATIONS, token);
       }
       else
       {
[jet@living]~/var/ctags% make
make
REPOINFO   main/repoinfo.h
make  all-am
make[1]: Entering directory '/home/jet/var/ctags'
REPOINFO   main/repoinfo.h
  CCLD     ctags
make[1]: Leaving directory '/home/jet/var/ctags'
[jet@living]~/var/ctags% ./ctags --kinds-Ada=+E -o - ~/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads
./ctags --kinds-Ada=+E -o - ~/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads
Coucou  /home/jet/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads   /^      entry Coucou;$/;"   E   taskspec:Tasche_T
Input   /home/jet/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads   /^package Input$/;" P
Inutile /home/jet/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads   /^   procedure Inutile$/;"  R   packspec:Input
Tasche_T    /home/jet/var/ctags/Units/parser-ada.r/ada-overriding.d/input.ads   /^   task type Tasche_T is new Carte_T with$/;" K   packspec:Input

Coucou рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд░рд┐рд╡рд░реНрддрди рд▓рдХреНрд╖реНрдп рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдФрд░ рдХрд╛рдо рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЕрдзрд┐рдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЕрдзрд┐рдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рднреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВ рдЬреЛ рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЦрд╛рд▓реА рд╕рдордп рд╣реИ рдЬрд┐рд╕реЗ ctags рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

# 2401 рджреЗрдЦреЗрдВред рдЕрдм Coucou рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред

рдореИрдВ рдПрдбреАрдП рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреНрдпрд╛ рддреБрдо рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реЛ?

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг:

   task Tasche_T is
      entry Coucou
         (Parameters : Parameters_Type);
   end Tasche_T;

рддрдерд╛

task type Tasche_T is
      entry Coucou
         (Parameters : Parameters_Type);
   end Tasche_T;

рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╡рд┐рдЬреНрдЮрд╛рдкрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
Https://github.com/universal-ctags/ctags/issues/1903 рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рд╡рд╣ рдХреЛрдб рдЯреБрдХрдбрд╝реЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ Ada рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдХреБрдЫ рд╕рдВрдХрд▓рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреЛ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рд╡рд╣ рдХреЗрд╡рд▓ рд╕реА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рд╕реА рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ:

printf("hello, world\n");

рд╕реНрд╡реАрдХрд╛рд░реНрдп:

#include <stdio.h>
int
main(void)
{
   printf("hello, world\n");
   return 0;
}

client.adb рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рдЫреВрдЯ:

with Ada.Text_IO;

procedure Client is

   ---------------------------------------------------------------------------
   --  Define the tasks
   task Ma_Tasche is
      entry Accepter
         (Continuer : Boolean);
   end Ma_Tasche;

   task Mon_Autre_Tasche;

   --  Define body of the tasks

   task body Ma_Tasche is
      Var_Continuer : Boolean := False;
   begin
      Boucle_Principale :
      loop
         accept Accepter
            (Continuer : Boolean)
         do
            Var_Continuer := Continuer;
         end Accepter;
      end loop Boucle_Principale;
   end Ma_Tasche;

   task body Mon_Autre_Tasche is
   begin
      null;
   end Mon_Autre_Tasche;
   ---------------------------------------------------------------------------

begin

   Ada.Text_IO.Put_Line ("Tasks won't stop, kill it with CTRL-C");
   Ma_Tasche.Accepter (Continuer => True);

end Client;

рдЖрдкрдХреЛ Adacore рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ FSF gcc-ada рд╡рд░реНрдЬрди рдпрд╛ GNAT рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ

  • FSF gcc рдХреЗ рд╕рд╛рде gcc -c client.adb; (рдФрд░ gnatbind client; gnatlink client рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░реЗрдВ)ред
  • рдпрд╛ gnatmake client.adb
  • рдпрд╛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╝рд╛рдЗрд▓ client.gpr рдмрдирд╛рдПрдВ рдФрд░ gprbuild -Pclient.gpr рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ

рдореИрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ рдорд▓реНрдЯреА-рдлрд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдмрд╣реБ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕реНрдХрд░рдг:

client.gpr рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ

project Client is

   for Main use ("client.adb");

   for Source_Dirs use ("src/**");
   for Object_Dir  use "obj/";
   for Exec_Dir    use "bin/";

   for Create_Missing_Dirs use "True";

   package Compiler is
      for Default_Switches ("Ada")  use ("-O0", "-Wall");
   end Compiler;

end Client;

src/client.adb рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ

with Ada.Text_IO;
with Mes_Tasches_P;

procedure Client is

begin

   Ada.Text_IO.Put_Line ("Tasks won't stop, kill it with CTRL-C");
   Mes_Tasches_P.Ma_Tasche.Accepter (Continuer => True);

end Client;

src/mes_tasches_p.ads рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ

package Mes_Tasches_P is

   task Ma_Tasche is
      entry Accepter
         (Continuer : Boolean);
   end Ma_Tasche;

   task Mon_Autre_Tasche;

end Mes_Tasches_P;

src/mes_tasches_p.adb рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ

package body Mes_Tasches_P is

   task body Ma_Tasche is
      Var_Continuer : Boolean := False;
   begin
      Boucle_Principale :
      loop
         accept Accepter
            (Continuer : Boolean)
         do
            Var_Continuer := Continuer;
         end Accepter;
      end loop Boucle_Principale;
   end Ma_Tasche;

   task body Mon_Autre_Tasche is
   begin
      null;
   end Mon_Autre_Tasche;

end Mes_Tasches_P;

tree . рдХрдорд╛рдВрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо

.
тФЬтФАтФА client.gpr
тФФтФАтФА src
    тФЬтФАтФА mes_tasches_p.adb
    тФЬтФАтФА mes_tasches_p.ads
    тФФтФАтФА client.adb

рдЗрд╕реЗ gprbuild -Pclient.gpr рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ

рдореИрдВ рднреЗрджрднрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╡реЗрдЪрдХ, рд╕рдВрд░рдХреНрд╖рд┐рдд, рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░, рд╕рдВрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рднреВрд▓ рдЧрдпрд╛ред

рдлрд╝рд╛рдЗрд▓ mes_tasches_p.ads

package Mes_Tasches_P is

   task Ma_Tasche is
      entry Accepter
         (Continuer : Boolean);
   end Ma_Tasche;

   task Mon_Autre_Tasche;

   task type Tasche_Type_1_T;

   Une_Tasche : Tasche_Type_1_T;

   task type Tasche_Type_2_T is
      entry Start;
      entry Lire
         (Donnee : out Integer);
   end Tasche_Type_2_T;

   --  Task type with discriminant.
   task type Tasche_Type_3_T
      --  We could have any number of arguments in discriminant
      --  Work exactly like argument in procedure/function/entry/accept
      (Taille : Integer)
   is
      entry Start;
   end Tasche_Type_3_T;

   --  protected objects.

   protected Objet_Protege is
      entry Demarrer;
      procedure Faire;
      function Tester return Boolean;
   private
      Variable : Boolean := True;
   end Objet_Protege;

   protected type Type_Protege is
      entry Demarrer;
      procedure Faire;
      function Tester return Boolean;
   private
      Variable : Boolean := True;
   end Type_Protege;

   protected type Discriminant_Protege
      (Priorite : Natural)
   is
      entry Demarrer;
      procedure Faire;
      function Tester return Boolean;
   private
      Variable : Boolean := True;
   end Discriminant_Protege;

end Mes_Tasches_P;

рдлрд╝рд╛рдЗрд▓ mes_tasches_p.adb

package body Mes_Tasches_P is

   ---------------------------------------------------------------------------
   task body Ma_Tasche is
      Var_Continuer : Boolean := False;
   begin
      Boucle_Principale :
      loop
         accept Accepter
            (Continuer : Boolean)
         do
            Var_Continuer := Continuer;
         end Accepter;
      end loop Boucle_Principale;
   end Ma_Tasche;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   task body Mon_Autre_Tasche is
   begin
      null;
   end Mon_Autre_Tasche;
   ---------------------------------------------------------------------------

   Une_Autre_Tasche_1 : Tasche_Type_1_T;

   ---------------------------------------------------------------------------
   task body Tasche_Type_1_T is
   begin
      null;
   end Tasche_Type_1_T;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   task body Tasche_Type_2_T is
   begin
      null;
   end Tasche_Type_2_T;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   task body Tasche_Type_3_T is
   begin
      null;
   end Tasche_Type_3_T;
   ---------------------------------------------------------------------------

   Une_Autre_Tasche_2 : Tasche_Type_2_T;
   Une_Autre_Tasche_3 : Tasche_Type_3_T (Taille => 5);

   ---------------------------------------------------------------------------
   protected body Objet_Protege is
      entry Demarrer
         when Variable
      is
      begin
         null;
      end Demarrer;

      procedure Faire is
      begin
         null;
      end Faire;

      function Tester
         return Boolean
      is
      begin
         return Variable;
      end Tester;
   end Objet_Protege;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   protected body Type_Protege is
      entry Demarrer
         when Variable
      is
      begin
         null;
      end Demarrer;

      procedure Faire is
      begin
         null;
      end Faire;

      function Tester
         return Boolean
      is
      begin
         return Variable;
      end Tester;
   end Type_Protege;
   ---------------------------------------------------------------------------

   ---------------------------------------------------------------------------
   protected body Discriminant_Protege is
      entry Demarrer
         when Variable
      is
      begin
         null;
      end Demarrer;

      procedure Faire is
      begin
         null;
      end Faire;

      function Tester
         return Boolean
      is
      begin
         return Variable;
      end Tester;
   end Discriminant_Protege;
   ---------------------------------------------------------------------------

end Mes_Tasches_P;

client.adb рдФрд░ client.gpr рдореЗрдВ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВред

рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореИрдВ рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ рдмрджрд▓ рджреВрдВрдЧрд╛ред

рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдорд▓рд╛ рдПрдХреАрдХреГрдд рд╣реИред рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдореЗрд░рд╛ рдПрдХ рдФрд░ рдирд┐рд╡реЗрджрди рд╣реИред
рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ / рд╕рдореАрдХреНрд╖рд╛-рдЬрд░реВрд░рдд .r рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред Ada рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ, generalized_stack.ads.tред
рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдПрдХреНрд╕рдпреВрдмрд░реЗрдВрдЯ-рдХреЗрдЯреИрдЧреНрд╕ рд╕реЗ рдХреА рд╣реИред рдлреЛрд░реНрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛; рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП ctags рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрднреА рддрдХ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм, рдЖрдк рдпрд╣рд╛рдБ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░реЗрдВред

     1  -- Object-oriented generalized stack.  This illustrates the use of a
     2  -- controlled type, which is one that has construction and destructions.
     3  -- It also shows how to create two related types in the same package so
     4  -- that they can share private declarations.  This sort of thing is
     5  -- accomplished in Java or C++ using nested classes, or using friend
     6  -- declarations in C++.
     7  --
     8  with Ada.Finalization; use Ada.Finalization;
     9  
    10  package GenStack is
    11      -- This is the stack type.
    12      type Stack is new Controlled with private;
    13  
    14      -- This is the base type for nodes.  Client packages must derive their
    15      -- nodes from StackData.  Since it comes from Controlled, the user can
    16      -- override the Initialize, Adjust, and Finalize methods as needed.
    17      type StackData is new Controlled with null record;
    18  
    19      -- Initialization operations.
    20      procedure Initialize(S: in out Stack);
    21      procedure Adjust(S: in out Stack);
    22      procedure Finalize(S: in out Stack);
    23  
    24      -- Stack operations.
    25      procedure Push(S: in out Stack; D: StackData'class);
    26      procedure Pop(S: in out Stack; D: in out StackData'class);
    27      procedure Top(S: Stack; Data: in out StackData'class);
    28      function Empty(S: Stack) return Boolean;
    29  
    30      private
    31      -- Pointer to the node type.
    32      type Node;
    33      type Node_Ptr is access Node;
    34  
    35      -- Here is the generalized stack itself.  We would just make it the
    36      -- pointer itself, but it needs to be a record so it can be in a with.
    37      type Stack is new Controlled with record
    38          Head: Node_Ptr;
    39      end record;
    40  
    41      -- Now, we need a pointer to the data part.
    42      type Data_Ptr is access StackData'Class;
    43  
    44      -- This is the node type.
    45      type Node is record
    46          Data: Data_Ptr;
    47          Next: Node_Ptr;
    48      end record;
    49  
    50  end GenStack;

рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдПрдбрд╛ рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЯреИрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╣реИ рдЬреЛ рдореИрдВ рддрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред

рд▓рд╛рдЗрди 32 рджреЗрдЦреЗрдВ:

    32      type Node;

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Node рдЯреИрдЧ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?
Ada parser рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕реЗ рдЯреИрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рддреЛ, рдЕрдЧрд░ рдЖрдкрдХрд╛ рдЬрд╡рд╛рдм рд╣рд╛рдВ рд╣реИ, рддреЛ Ada parser рдореЗрдВ рдмрдЧ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЕрдЧрд░ рдЖрдкрдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╕реБрдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред

рд▓рд╛рдЗрди 32 type Node; рдХрд╛ рдЕрд░реНрде typedef struct s_List List; C , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ctags рдЗрд╕реЗ рдЯреИрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рдирд╛рдо рдХреЗ рдЖрдЧреЗ type name declaration рдЬреИрд╕реЗ рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд░реЗрдЦрд╛ 45 рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЫреВрдЯ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдХреБрдЫ рдФрд░ рд▓рд┐рдЦреВрдВ?

рдУрд╣, рдореБрдЭреЗ рдмрд╣реБрдд рдЦреЗрдж рд╣реИред u-ctags 32 рдирдВрдмрд░ рдкрд░ рдиреЛрдб рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ:

% u-ctags -n -o - --kinds-Ada='*' input.ads | grep ^Node
Node    input.ads   32;"    T   language:Ada    packspec:GenStack   file:
Node    input.ads   45;"    t   language:Ada    packspec:GenStack   file:
Node_Ptr    input.ads   33;"    t   language:Ada    packspec:GenStack   file:

рдореИрдВрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЧрд▓рдд рдмрддрд╛рдпрд╛ред

рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЫреВрдЯ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдХреБрдЫ рдФрд░ рд▓рд┐рдЦреВрдВ?
рднреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдмрд╛рд░, рдореБрдЭреЗ рдЖрдкрд╕реЗ рдХрдИ рдЗрдирдкреБрдЯ рдорд┐рд▓реЗред рддреЛ рдЕрдм рдмрд╣реБрдд рд╣реЛ рдЧрдпрд╛ред

--Kinds-Ada = * рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, ctags 32 рд▓рд╛рдЗрди рдкрд░ рдиреЛрдб рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рд╛рдЗрди 38 рдкрд░ "рд╣реЗрдб" рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдбреЗрдЯрд╛ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ рдореЗрдВ рд▓рд╛рдЗрди 46 рдФрд░ рд▓рд╛рдЗрди 47 рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдФрд░ рдкреИрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдЗрдирдкреБрдЯ рдФрд░ Ada рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jayceekay picture jayceekay  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fabiensabatie picture fabiensabatie  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

trevordmiller picture trevordmiller  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

liuchengxu picture liuchengxu  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

softinio picture softinio  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ