Как определить анализатор ctag для пользовательского формата файла

#ctags

#ctags

Вопрос:

Я регулярно использую формат файла, в котором нет анализатора для Ctags. Я хотел бы написать анализатор для этого, но я не уверен, как. Формат файла не содержит ключевых слов, как в компьютерном языке, но вместо этого ваше местоположение в файле зависит от содержимого последних 10 столбцов каждой строки в файле. (Извините, формат ENDF был создан в 1960-х годах.)

Как я могу создать новый анализатор, который зависит от содержимого определенного столбца?

Вот сокращенный пример файла, но он все еще содержит достаточно информации, чтобы понять суть того, что я пытаюсь сделать:

                                                                   MMMMFFTTT
                               33        856        176          17434 1451
                               34          2        155          17434 1451
                               34         51        115          17434 1451
 0.000000 0 0.000000 0          0          0          0          07434 1  0
 0.000000 0 0.000000 0          0          0          0          07434 0  0
 7.418300 4 1.813790 2          0          0          1          07434 2151
 7.418300 4 1.000000 0          0          0          2          07434 2151
 1.000000-5 5.000000 3          1          7          0          17434 2151
 0.000000 0 0.000000 0          0          3          5          07434 2151
 0.000000 0 0.000000 0          2          0         24          47434 2151
 7.418300 4 1.813790 2          0          0          0          07434 3 28
-7.222000 6-7.222000 6          0          0          1         397434 3 28
         39          2                                            7434 3 28
 7.261820 6 0.000000 0 9.300000 6 0.000000 0 9.600000 6 2.18585-137434 3 28
 1.000000 7 5.01372-13 1.050000 7 1.32071-11 1.100000 7 8.70475-107434 3 28
 0.000000 0 0.000000 0          0          0          0          07434 3  0
 7.418300 4 1.813790 2          0          0          0          07434 3 37
-2.093600 7-2.093600 7          0          0          1         207434 3 37
 2.105140 7 0.000000 0 2.200000 7 7.150990-5 2.400000 7 2.707920-27434 3 37
 1.300000 8 5.411910-2 1.500000 8 3.895580-2                      7434 3 37
 0.000000 0 0.000000 0          0          0          0          07434 3  0
 7.418300 4 1.813790 2          0          0          0          07434 3 41
-1.328500 7-1.328500 7          0          0          1         267434 3 41
         26          2                                            7434 3 41
 1.335820 7 0.000000 0 1.550000 7 0.000000 0 1.600000 7 2.56183-147434 3 41
 1.700000 7 9.60380-12 1.800000 7 3.02742-10 1.900000 7 1.474340-77434 3 41
 1.300000 8 1.582280-2 1.500000 8 1.154350-2                      7434 3 41

  

Я пометил столбцы MMMM , FF и TT . Когда эти изменения происходят, мне нужен «тег» (используя термин свободно), чтобы сообщить мне, что он изменился. Обратите внимание, это (своего рода) вложено в это, в каждом TT есть много FF s, и много FF s внутри каждого MMMM .

Я не уверен, как должен выглядеть вывод тега. Я никогда даже не смотрел на выходные данные тегов; Я всегда полагался на то, что кто-то другой разберет их за меня. Пожалуйста, помогите этому новичку, пока я пытаюсь учиться.

Я написал синтаксический анализатор для Vim несколько лет назад и надеялся, что это может стать хорошим дополнением.

Комментарии:

1. Не могли бы вы показать несколько примеров и ожидаемые выходные данные ctags?

2. Только что добавил пример. Мне следовало подумать об этом раньше. Извините.

3. Возможно, вы захотите определить анализатор в .ctags. Однако вы не можете этого сделать, потому что анализатор должен работать с полным состоянием. Я рекомендую вам написать анализатор на C, если он вам нужен сейчас. Если вы можете подождать месяц, у меня есть дополнительное предложение. Откройте проблему на github.com/universal-ctags/ctags .

4. Как мне это сделать? Отличается ли это от того, что я спрашивал?

5. Чтобы понять, чего вы хотите, необходимо некоторое слушание. Сделать это здесь сложно. Не могли бы вы открыть проблему на сайте github?

Ответ №1:

Мой ответ предполагает, что вы используете Universal-ctags (https://ctags.io).

Я полагаю, вы знаете основную концепцию ctags: виды и поля. Смотрите https://docs.ctags.io/en/latest/man/ctags.1.html#tag-entries если вы их не знаете.

Я полагаю, вы знаете формат вывода ctags. Смотрите https://docs.ctags.io/en/latest/man/tags.5.html если вы не знаете.

Существуют различные способы реализации анализатора в ctags. В этом случае вы можете захотеть написать анализатор на языке C с ориентацией на строку.

                     33        856        176          17434 1451
                    34          2        155          17434 1451
...
  

Вы можете ожидать, что 7434 в первой строке помечен как mmmm.
Однако вы можете не ожидать 7434 во второй строке.
Анализатор должен иметь возможность отслеживать состояние ввода; анализатор не должен создавать тег, имя которого уже помечено.
Это означает, что вы не можете определить анализатор для языка в ваших .ctags с регулярными выражениями. Возможно, вам придется написать это на C.

Входной сигнал ориентирован на строку. Итак, вы можете использовать функцию readLineFromInputFile. Это сердце анализатора, ориентированного на строку.

https://github.com/masatake/ctags/commit/e8e0015393ae7a3b447ee886bd0884f45d11ced2 это доступный для выполнения пример, иллюстрирующий, как использовать readLineFromInputFile.

В примере ctags выдает следующие теги:

 $ ctags --options=NONE --list-kinds=ENDF
m  materials
f  material files
t  material subdivisions

$ ctags --options=NONE  --sort=no -o - input.endf 
434     input.endf  /^                               33        856        176          17434 1451$/;"   m
14  input.endf  /^                               33        856        176          17434 1451$/;"   f   mat:434 
51  input.endf  /^                               33        856        176          17434 1451$/;"   t   mf:434 14
...