我正在寫一個自定義語言.ctags文件......最喜歡的語言的正則表達式多次聲明,它允許多個變量聲明在同一行..即:的ctags在一行
int a, b, c;
我有承認「一個」基本的正則表達式:
--regex-mylang=/^[ \t]*int[ \t]*([a-zA-Z_0-9]+)/\1/v,variable/
如何修改這個有它匹配「b」和「C」,以及?在ctags文檔中,我找不到在單行中處理多個匹配的任何內容。
我正在寫一個自定義語言.ctags文件......最喜歡的語言的正則表達式多次聲明,它允許多個變量聲明在同一行..即:的ctags在一行
int a, b, c;
我有承認「一個」基本的正則表達式:
--regex-mylang=/^[ \t]*int[ \t]*([a-zA-Z_0-9]+)/\1/v,variable/
如何修改這個有它匹配「b」和「C」,以及?在ctags文檔中,我找不到在單行中處理多個匹配的任何內容。
經過這幾個小時後,我堅信它不能完成。無論如何,正則表達式只會擴展爲每行一個標籤。即使您將\ 1 \ 2 \ 3 ...作爲擴展名,這隻會導致由多個匹配組成的標籤,而不是每個匹配的一個標籤。
它正確解析C示例,因爲它在ctags源代碼中使用實際的代碼解析器,而不是正則表達式。
你試圖用正則表達式進行解析,這通常是不可能的。解析需要相當於將信息存儲在堆棧上,但正則表達式只能包含有限數量的不同狀態。
--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/
它可以用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
的最新通用-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。
這是怎麼回答的?它是否做任何形式的多重匹配?任何人都可以解釋這是什麼嗎? –