Exuberant Ctags#
Program ctags#
Obsługa języków#
W programie ctags obsługa języków jest realizowana poprzez jedno z dwóch poniższych rozwiązań:
Dodawanie nowych języków poprzez wyrażenia regularne jest najłatwiejsze w implementacji, ale rozwiązanie to jest z automatu ograniczane możliwościami samych wyrażeń regularnych. Kompleksowe indeksowanie kodu najczęściej wiąże się z utworzeniem osobnego parsera dla danego języka, gdzie jedynymi ograniczeniami są w zasadzie umiejętności ich autorów oraz sposób obsługi parserów przez program ctags.
Tabela z informacjami o językach#
W poniższej tabeli (41 pozycji) zamieszczam najważniejsze informacje dla wszystkich języków obsługiwanych przez wewnętrzne parsery w ostatniej oficjalnej wersji programu ctags (źródło). Są to m.in.: nazwa języka, identyfikator języka (używany w niektórych argumentach - wielkość znaków nie ma znaczenia), domyślne rozszerzenia pliku dla języka i jego parser (w postaci linku do pliku).
Język | Identyfikator | Rozszerzenia | Parser |
---|---|---|---|
Ant | Ant | .build.xml | ant.c |
Assembler | Asm | (*.A51) (*.29[kK]) (*.[68][68][kKsSxX]) (*.[xX][68][68]) .asm .ASM .s .S | asm.c |
ASP | Asp | .asp .asa | asp.c |
Awk | Awk | .awk .gawk .mawk | awk.c |
BASIC | Basic | .bas .bi .bb .pb | basic.c |
BETA | BETA | .bet | beta.c |
C | C | .c | c.c |
C++ | C++ | .c++ .cc .cp .cpp .cxx .h .h++ .hh .hp .hpp .hxx | c.c |
C# | C# | .cs | c.c |
COBOL | Cobol | .cbl .cob .CBL .COB | cobol.c |
DOS Batch | DosBatch | .bat .cmd | dosbatch.c |
Eiffel | Eiffel | .e | eiffel.c |
Erlang | Erlang | .erl .ERL .hrl .HRL | erlang.c |
Flex | Flex | .as .mxml | flex.c |
Fortran | Fortran | .f .for .ftn .f77 .f90 .f95 | fortran.c |
HTML | HTML | .htm .html | html.c |
Java | Java | .java | c.c |
JavaScript | JavaScript | .js | jscript.c |
Lisp | Lisp | .cl .clisp .el .l .lisp .lsp | lisp.c |
Lua | Lua | .lua | lua.c |
Make | Make | ([Mm]akefile) (GNUmakefile) .mak .mk | make.c |
MATLAB | MatLab | .m | matlab.c |
Objective Caml | OCaml | .ml .mli | ocaml.c |
Pascal | Pascal | .p .pas | pascal.c |
Perl | Perl | .pl .pm .plx .perl | perl.c |
PHP | PHP | .php .php3 .phtml | php.c |
PL/SQL | SQL | .sql | sql.c |
Python (Pyrex/Cython) | Python | .py .pyx .pxd .pxi .scons | python.c |
REXX | REXX | .cmd .rexx .rx | rexx.c |
Ruby | Ruby | .rb .ruby | ruby.c |
Scheme | Scheme | .SCM .SM .sch .scheme .scm .sm | scheme.c |
Shell scripts (Bourne/Korn/Z) | Sh | .sh .SH .bsh .bash .ksh .zsh | sh.c |
S-Lang | SLang | .sl | slang.c |
SML (Standard ML) | SML | .sml .sig | sml.c |
Tcl | Tcl | .tcl .tk .wish .itcl | tcl.c |
TeX | TeX | .tex | tex.c |
Vera | Vera | .vr .vri .vrh | c.c |
Verilog | Verilog | .v | verilog.c |
VHDL | VHDL | .vhdl .vhd | vhdl.c |
Vim | Vim | .vim | vim.c |
YACC | YACC | .y | yacc.c |
Parsery w osobnych plikach#
W programie ctags największe możliwości dla indeksowania kodu zapewniają dedykowane parsery. Jeśli domyślny zestaw parserów nie spełnia naszych oczekiwań to można pokusić się o napisanie własnego parsera (instrukcja). Tworzenie nowych parserów wymaga większego nakładu pracy w porównaniu z wyrażeniami regularnymi ustawianymi przez argumenty, gdzie po utworzeniu pliku z parserem należy go skompilować z obecnym źródłem projektu. Rozwiązanie to przewidziano dla bardziej zaawansowanych programistów obytych z tworzeniem tego typu narzędzi.
Aktualną listę domyślnych parserów oraz powiązane z nimi rozszerzenia można pobrać z informacji o wewnętrznym stanie programu zwracanych przez argumenty --verbose
lub -V
(użytych jako inicjujący argument).
Trzeba wyraźnie zaznaczyć, że wbudowane parsery również można rozszerzać dodatkowymi wyrażeniami regularnymi za pośrednictwem argumentu --regex-<lang>
, ale rozwiązanie to jest ograniczane możliwościami samych wyrażeń regularnych.
Wyrażenia regularne w argumentach#
W programie ctags istnieje możliwość indeksowania dowolnego kodu przy użyciu własnych wyrażeń regularnych, ale tylko w sytuacji, kiedy dodano funkcję +regex
w czasie kompilacji programu ctags, co można sprawdzić np. argumentem --version
. W porównaniu z dedykowanymi parserami możliwości tego rozwiązania są bardzo ograniczone, ale z uwagi na prostotę i szybkość implementacji warto najpierw pokombinować w tym kierunku.
Własne wyrażenia regularne definiujemy argumentem --regex-<lang>
, który działa dla wszystkich języków obsługiwanych przez program ctags (zarówno tych pochodzących z wbudowanych parserów, jak i tych utworzonych argumentem --langdef
).