2012-05-24 81 views
6

我正在寫一個自定義語言.ctags文件......最喜歡的語言的正則表達式多次聲明,它允許多個變量聲明在同一行..即:的ctags在一行

int a, b, c; 

我有承認「一個」基本的正則表達式:

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

如何修改這個有它匹配「b」和「C」,以及?在ctags文檔中,我找不到在單行中處理多個匹配的任何內容。

回答

2

經過這幾個小時後,我堅信它不能完成。無論如何,正則表達式只會擴展爲每行一個標籤。即使您將\ 1 \ 2 \ 3 ...作爲擴展名,這隻會導致由多個匹配組成的標籤,而不是每個匹配的一個標籤。

它正確解析C示例,因爲它在ctags源代碼中使用實際的代碼解析器,而不是正則表達式。

0

你試圖用正則表達式進行解析,這通常是不可能的。解析需要相當於將信息存儲在堆棧上,但正則表達式只能包含有限數量的不同狀態。

-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

這是怎麼回答的?它是否做任何形式的多重匹配?任何人都可以解釋這是什麼嗎? –

0

它可以用Universal Ctags{_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 
2

最新通用-CTAGS可以捕捉它們。

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

詳情請參閱http://docs.ctags.io/en/latest/optlib.html#byte-oriented-pattern-matching-with-multiple-regex-tables