2012-05-24 21 views
6

Estoy escribiendo un archivo .ctags para un idioma personalizado ... Al igual que la mayoría de los idiomas, que permite múltiples declaraciones de variables en una línea .. es decir:ctags expresiones regulares para múltiples declaraciones en una línea

int a, b, c; 

tengo una expresión regular básica que reconoce 'a':

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

¿Cómo puedo modificar esto para tenerlo coincide con 'b' y 'c', así? No puedo encontrar nada en la documentación de ctags que trate múltiples coincidencias en una sola línea.

Respuesta

2

Después de pasar esto por unas horas, estoy convencido de que no se puede hacer. No importa qué, la expresión regular solo se expandirá a una etiqueta por línea. Incluso si pone \ 1 \ 2 \ 3 ... como la expansión, eso solo causaría una etiqueta que consta de múltiples coincidencias, en lugar de una etiqueta por coincidencia.

Analiza correctamente el ejemplo C porque dentro del código fuente de ctags utiliza un analizador de código real, no una expresión regular.

0

Está tratando de hacer un análisis sintáctico con una expresión regular, que generalmente no es posible. El análisis requiere el equivalente de almacenar información en una pila, pero una expresión regular solo puede contener un número finito de estados diferentes.

-2
--regex-perl=/^\s*?use\s+(\w+[\w\:]*?\w*?)/\1/u,use,uses/ 
--regex-perl=/^\s*?require\s+(\w+[\w\:]*?\w*?)/\1/r,require,requires/ 
--regex-perl=/^\s*?has\s+['"]?(\w+)['"]?/\1/a,attribute,attributes/ 
--regex-perl=/^\s*?\*(\w+)\s*?=/\1/a,aliase,aliases/ 
--regex-perl=/->helper\(\s?['"]?(\w+)['"]?/\1/h,helper,helpers/ 
--regex-perl=/^\s*?our\s*?[\[email protected]%](\w+)/\1/o,our,ours/ 
--regex-perl=/^=head1\s+(.+)/\1/p,pod,Plain Old Documentation/ 
--regex-perl=/^=head2\s+(.+)/-- \1/p,pod,Plain Old Documentation/ 
--regex-perl=/^=head[3-5]\s+(.+)/---- \1/p,pod,Plain Old Documentation/ 
+0

¿Cómo es esa una respuesta? ¿Hace algún tipo de coincidencia múltiple? ¿Alguien puede explicar lo que hace? –

0

se puede hacer parcialmente con el Universal Ctags y con la ayuda de {_multiline=N} y {scope} bandera. El N es un número de grupo cuya posición se guarda en el archivo generado tags. Para más información lee aquí: docs/optlib.rst

Configuración: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} 

Archivo de prueba:test.txt

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

generar etiquetas con: ctags --options=mylang.ctags test.txt

generada tags archivo:

!_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 
2

Los última Universal-ctags pueden capturarlos.

[[email protected]]/tmp% cat input.x 
int a, b, c; 

[[email protected]]/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/.// 


[[email protected]]/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 

Ver http://docs.ctags.io/en/latest/optlib.html#byte-oriented-pattern-matching-with-multiple-regex-tables para obtener más detalles.

Cuestiones relacionadas