Название парсера: Универсальные ctags, установленные вместе с Homebrew.
Командная строка, которую вы использовали для запуска 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:
Homebrew с настройками по умолчанию.
Спасибо. Я ввел код для пропуска «переопределения» и «отказа от переопределения». См. № 2383.
Однако синтаксический анализатор Ada по-прежнему не может захватить "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 :-P.
См. №2401. Теперь Coucou хорошо схвачен.
Я хотел бы расширить наши модульные тестовые примеры для Ada. Не могли бы вы помочь мне?
Примеры, которые вы показали:
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 .
Думаю, вы показали фрагменты кода.
Так что я полагаю, что компилятор Ады может их не принять.
Хотелось бы, чтобы компилятор чего-нибудь допустил для входных файлов.
Однако он должен быть небольшим.
Я знаю только C. Итак, я хотел бы объяснить, что я хочу от C.
Неприемлемо:
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;
Вам нужна версия FSF gcc-ada или GNAT на веб-сайте Adacore.
Скомпилируйте его с помощью
gcc -c client.adb;
(и ссылка на gnatbind client; gnatlink client
если вы используете exe) с FSF gcc.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
.
Спасибо. Он успешно построен.
Я конвертирую его в тестовый пример.
Тестовый пример интегрирован. Большое спасибо.
У меня еще одна просьба.
В каталоге Units / review-required.r. есть тестовый пример для Ada, generalized_stack.ads.t.
В каталоге содержатся тестовые примеры, которые остаются неизменными с тех пор, как мы начали этот проект путем разветвления из exuberant-ctags. При разветвлении я не знал Аду, поэтому тестовый пример на самом деле не тестировался; вывод 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 не помечает его.
Итак, если ваш ответ положительный, значит, в парсере Ada есть ошибка. Я бы хотел это исправить.
Если ваш ответ отрицательный, я хотел бы услышать причину. Я хотел бы применить то, что вы говорите, к тесту.
Строка 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 захватывает Node в строке 32.
Однако «Head» в строке 38 не захватывается, хотя Data и Next в строке 46 и строке 47 фиксируются.
Может понадобиться еще один патч.
Я объединил изменения для устранения этой проблемы.
Спасибо за предоставленные тестовые данные и знания об Аде.