рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдирд╛рдо: рд╣реЛрдордмреНрд░реЙ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд╕реАрдЯреАрдЬреА
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЬрд┐рд╕реЗ рдЖрдк 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
рдЗрд╕реА рд╢рд░реАрд░:
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЬрд┐рд╕реЗ рдЖрдк 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:
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 рдмрд╛рдЗрдирд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╣реЛрдордмреНрд░реЗред
рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ "рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ" рдФрд░ "рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдирд╣реАрдВ" рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреЗрд╢ рдХрд┐рдпрд╛ред # 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 рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ
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 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред