我正在为自定义语言编写.ctags文件...与大多数语言一样,它允许在一行中进行多个变量声明..即:
int a, b, c;
我有一个基本的正则表达式,它识别'a':
--regex-mylang=/^[ \t]*int[ \t]*([a-zA-Z_0-9]+)/\1/v,variable/
如何修改它以使其与'b'和'c'匹配?我在ctags文档中找不到任何可以在一行中处理多个匹配的内容。
答案 0 :(得分:3)
最新 Universal-ctags可以捕获它们。
culture
有关详细信息,请参阅http://docs.ctags.io/en/latest/optlib.html#byte-oriented-pattern-matching-with-multiple-regex-tables。
答案 1 :(得分:2)
经历了几个小时之后,我确信它无法完成。无论如何,正则表达式每行只会扩展到一个标记。即使您将\ 1 \ 2 \ 3 ...作为扩展,也只会导致标记由多个匹配组成,而不是每个匹配一个标记。
它正确解析C示例,因为在ctags源代码中它使用的是实际的代码解析器,而不是正则表达式。
答案 2 :(得分:0)
您正在尝试使用正则表达式进行解析,这通常是不可能的。解析需要相当于在堆栈上存储信息,但正则表达式只能包含有限数量的不同状态。
答案 3 :(得分: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
答案 4 :(得分:-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*?[\$@%](\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/