2012-05-24 4 views
6

Sto scrivendo un file .ctags per un linguaggio personalizzato ... Come la maggior parte lingue, consente di utilizzare vari dichiarazioni di variabili in una sola riga .. cioè:ctags RegEx per dichiarazioni multiple in una sola riga

int a, b, c; 

ho un regex base che riconosce 'a':

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

come faccio a modificare questo di averlo abbinare 'b' e 'c', come bene? Non riesco a trovare nulla nella documentazione di ctags che si occupa di più corrispondenze in una singola riga.

risposta

2

Dopo aver attraversato questo per alcune ore, sono convinto che non può essere fatto. Non importa cosa, l'espressione regolare si espanderà solo su un tag per riga. Anche se metti \ 1 \ 2 \ 3 ... come espansione, ciò causerebbe solo un tag composto da più corrispondenze, invece di un tag per partita.

Analizza correttamente l'esempio C perché all'interno del codice sorgente ctags utilizza un parser di codice effettivo, non un'espressione regolare.

0

Stai cercando di eseguire l'analisi con un'espressione regolare, che in genere non è possibile. L'analisi richiede l'equivalente di memorizzare le informazioni in una pila, ma un'espressione regolare può incorporare solo un numero finito di stati diversi.

-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

Come è una risposta? Fa qualche tipo di abbinamento multiplo? Qualcuno può spiegare cosa fa questo? –

0

può essere parzialmente fatto con Universal Ctags e con l'aiuto di {_multiline=N} e {scope} flag. Lo N è il numero di gruppo che la posizione viene salvata nel file tags generato. Per ulteriori informazioni consultare qui: docs/optlib.rst

Configurazione: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} 

file di test:test.txt

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

generare tag con: ctags --options=mylang.ctags test.txt

generata tags di file:

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

I ultima Universal-ctags loro grado di catturare.

[[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 

Vedere http://docs.ctags.io/en/latest/optlib.html#byte-oriented-pattern-matching-with-multiple-regex-tables per ulteriori dettagli.