регулярное выражение ctags для нескольких объявлений в одной строке

Я пишу файл .ctags для пользовательского языка... Как и в большинстве языков, он допускает несколько объявлений переменных в одной строке.. т.е.:

int a, b, c;

У меня есть базовое регулярное выражение, которое распознает «а»:

--regex-mylang=/^[ \t]*int[ \t]*([a-zA-Z_0-9]+)/\1/v,variable/

Как мне изменить это, чтобы оно также соответствовало «b» и «c»? Я не могу найти в документации ctags ничего, что касается нескольких совпадений в одной строке.


person Stan    schedule 24.05.2012    source источник


Ответы (5)


Пройдя через это в течение нескольких часов, я убежден, что это невозможно сделать. В любом случае, регулярное выражение будет расширяться только до одного тега в строке. Даже если вы поместите \1 \2 \3 ... в качестве расширения, это просто вызовет тег, состоящий из нескольких совпадений, а не один тег на совпадение.

Он правильно анализирует пример C, потому что внутри исходного кода ctags он использует настоящий синтаксический анализатор кода, а не регулярное выражение.

person Thomas Vander Stichele    schedule 27.01.2013

Их могут захватить последние универсальные теги.

[jet@localhost]/tmp% cat input.x 
int a, b, c;

[jet@localhost]/tmp% cat x.ctags 
--langdef=X
--map-X=.x

--kinddef-X=v,var,variables
--_tabledef-X=main
--_tabledef-X=vardef

--_mtable-regex-X=main/int[ \t]+//{tenter=vardef}
--_mtable-regex-X=main/.//

--_mtable-regex-X=vardef/([a-zA-Z0-9]+)/\1/v/
--_mtable-regex-X=vardef/;//{tleave}
--_mtable-regex-X=vardef/.//


[jet@localhost]/tmp% u-ctags --options=x.ctags -o - ./input.x 
a   ./input.x   /^int a, b, c;$/;"  v
b   ./input.x   /^int a, b, c;$/;"  v
c   ./input.x   /^int a, b, c;$/;"  v

См. http://docs.ctags.io/en/latest/optlib.html#байт-ориентированный-шаблон-сопоставление-с-несколько-регулярных-таблиц для получения дополнительной информации.

person Masatake YAMATO    schedule 08.09.2017

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

person NovaDenizen    schedule 07.09.2012

частично это можно сделать с помощью универсальных C-тегов и с помощью флагов {_multiline=N} и {scope}. N - это номер группы, позиция которой сохраняется в сгенерированном tags файле. Для получения дополнительной информации см. здесь: docs/optlib.rst

Конфигурация: mylang.ctags

--langmap=mylang:.txt
--regex-mylang=/^[[:blank:]]*(int)[[:blank:]]/\1/{placeholder}{scope=set}{_multiline=1}
--regex-mylang=/(;)/\1/{placeholder}{scope=clear}
--regex-mylang=/[[:blank:]]*([[:alnum:]]+)[[:blank:]]*,?/\1/v,variable/{_multiline=1}{scope=ref}

Тестовый файл: test.txt

void main() {
   int   a, b, c, d;
}

Создайте теги с помощью: ctags --options=mylang.ctags test.txt

Создан файл tags:

!_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_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   /cb4476eb/
a   test.txt    /^   int   a, b, c, d;$/;"  v
b   test.txt    /^   int   a, b, c, d;$/;"  v
c   test.txt    /^   int   a, b, c, d;$/;"  v
d   test.txt    /^   int   a, b, c, d;$/;"  v
int test.txt    /^   int   a, b, c, d;$/;"  v
main    test.txt    /^void main() {$/;" v
void    test.txt    /^void main() {$/;" v
person Martin Vyskočil    schedule 26.06.2017
comment
Не работай. Я получаю сообщение об ошибке ctags: Warning: Unknown language "mylang:.txt" in "langmap" option ctags: Unknown language "mylang" in "regex-mylang" option - person ritchie; 03.04.2021

person    schedule
comment
Как это ответ? Выполняет ли он какое-либо множественное сопоставление? Кто-нибудь может объяснить, что это делает? - person Thomas Vander Stichele; 26.01.2013