【问题标题】:ctags regex for multiple declarations in one linectags 正则表达式用于一行中的多个声明
【发布时间】:2012-05-31 06:48:14
【问题描述】:

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

int a, b, c;

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

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

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

【问题讨论】:

    标签: ctags exuberant-ctags


    【解决方案1】:

    最新的 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          可以通过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: Warning: Unknown language "mylang:.txt" in "langmap" option ctags: Unknown language "mylang" in "regex-mylang" option
          【解决方案5】:
          --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/
          

          【讨论】:

          • 答案如何?它是否进行任何类型的多重匹配?谁能解释一下这是做什么的?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 2013-03-25
          • 1970-01-01
          • 2013-05-29
          相关资源
          最近更新 更多