8

我正在为自定义语言编写一个 .ctags 文件......像大多数语言一样,它允许在一行中声明多个变量......即:

int a, b, c;

我有一个识别“a”的基本正则表达式:

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

如何修改它以使其也匹配“b”和“c”?我在 ctags 文档中找不到任何在一行中处理多个匹配项的内容。

4

5 回答 5

5

最新的Universal-ctags 可以捕获它们。

[jet@localhost]/tmp% cat input.x 
int a, b, c;

[jet@localhost]/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/.//


[jet@localhost]/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

有关更多详细信息,请参阅https://docs.ctags.io/en/latest/optlib.html#advanced-pattern-matching-with-multiple-regex-tables

于 2017-09-08T19:06:17.240 回答
2

在经历了几个小时之后,我确信它无法完成。无论如何,正则表达式只会扩展为每行一个标签。即使你把 \1 \2 \3 ... 作为扩展,那只会导致一个标签由多个匹配项组成,而不是每个匹配项一个标签。

它正确解析了 C 示例,因为在 ctags 源代码中它使用了实际的代码解析器,而不是正则表达式。

于 2013-01-27T15:22:03.100 回答
0

您正在尝试使用正则表达式进行解析,这通常是不可能的。解析需要相当于将信息存储在堆栈上,但正则表达式只能体现有限数量的不同状态。

于 2012-09-07T18:04:31.030 回答
0

它可以通过Universal Ctags{_multiline=N}{scope}flag的帮助 部分完成。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
于 2017-06-26T11:33:53.987 回答
-4
--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*?[\$@%](\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/
于 2012-09-07T18:40:34.960 回答