#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
...