Таблица TAGS в Emacs смущена директивой #line в файлах lex / yacc - PullRequest
5 голосов
/ 24 августа 2011

Я пытаюсь сгенерировать таблицы TAGS, используя etags для большого программного проекта.Файл TAGS в конечном итоге содержит записи в несуществующие файлы на верхнем уровне вместо существующих в подкаталоге из-за директив #line в сгенерированных lex / yacc файлах .c, которые ссылаются на неквалифицированное имя файла вместо #строка, которая включает в себя подкаталог, содержащий файл.

Как я могу получить таблицы TAGS для генерации с этими директивами #line, правильно разрешенными в существующий файл в подкаталоге, вместо того, чтобы интерпретироваться как файлы верхнего уровня?

Я запускаю etags следующим образом из каталога верхнего уровня:

rm -f TAGS; find . \( -not -regex '.*include/.*' \)
                -a \( -name '*.h' -o -name '*.hh' -o -name '*.y' -o -name '*.l'
                   -o -name '*.cc' -o -name '*.cpp' -o -name '*.hpp' -o -name '*.c'
                   -o -name '*.inl' \)
             | xargs etags -o TAGS --append

Но у меня есть файл act / Par.c, который содержит следующие строки в середине сгенерированного файла:

#define T_NUM 274
#define T_STRING 275

#line 5 "Par.y"

#undef actCPMeshConfigIn_yywrap
#define actCPMeshConfigIn_YYMAXDEPTH 20000

Что приводит к следующим записям в таблице TAGS:

act/Par.c,1160
[...]
#define T_NUM 92,2870
#define T_STRING 93,2888

Par.y,1320
#undef actCPMeshConfigIn_yywrap20,
#define actCPMeshConfigIn_YYMAXDEPTH 22,

Но файл Par.y фактически расположен в act / Par.y, но директива #line имеет видотносительно текущего файла, но TAGS делает его относительно сгенерированного файла TAGS.

Без изменения способа создания проекта, как я могу сгенерировать файлы TAGS так,что эти директивы #line правильно интерпретируются как относящиеся к файлу, в котором они находятся?Кроме того, как я могу легко пропустить эти проблемные файлы?

1 Ответ

0 голосов
/ 29 ноября 2011

Решение состоит в том, чтобы вместо этого запустить Exuberant Ctags в режиме etgas и рекурсивно. Вы заставляете exuberant ctags работать в режиме etags, создавая ссылку с именем etags на exuberant ctags, и он обнаруживает, что он был запущен как etags, и ведет себя соответствующим образом:

Этагс -R.

Альтернативно -e означает режим etags:

ctags -e -R.

...