5

至于{, }and [, ]and (, ), 我真的很希望能够定义syntax regionfor <,>用于 C++ 模板用法,如下所示:

a<b>

但是,有没有办法创建这样一个语法区域而不会与以下内容发生冲突:

if( a < b<c>::d )

第一个<显然是“小于”运算符,应该作为模板参数区域的开始而被丢弃。

我尝试使用多个选项,但无法使其工作。尝试使用复杂的正则表达式来识别模板 args 区域并且不少于操作似乎确实是不可能的,它只能通过使用嵌套自引用模式检查平衡对来工作。

4

2 回答 2

4

基于@ingo-karkat 的回答,我对空格的使用进行了进一步的思考,我认为我得到了一个足够好的匹配模式(我认为这可以捕获 90% 以上的情况)。

syn region AngleBrackets matchgroup=AngleBracketContents 
start='[[:space:]<]\@<!<<\@!'
end='>'

start前面<没有空格或. 的匹配项。检查是否有空格是一个关键因素,因为大多数时间关系操作将被空格包围,而且,非常常见的做法是不要在模板开括号之前使用空格。<

我还检查它是否没有立即被另一个<.

这是我正在做的事情的快照(区域内的操作员获取区域的颜色,嵌套区域更改颜色,它建立在彩虹括号改进的一些小的修正上):

VIM 快照

更新

刚刚将我的 VIM 正则表达式更改为:

\v%(<operator\_s*)@<!%(%(\_i|template\_s*)@<=\<[<=]@!|\<@<!\<[[:space:]<=]@!)

最后一个实际上将帮助我实施良好的代码风格。

于 2012-11-29T19:24:45.370 回答
1

只要您为80% 的解决方案拍摄并将其中的文本限制<...>为非空白标识符(假设您的编码风格围绕带有空白的比较运算符),通过使用:syntax match而不是:syntax region(它已经在开始匹配时触发,而不检查结束匹配的存在),应该可以工作(因为单个正则表达式必须同时匹配开始和结束)。

关于解析 C++(在真正的编译器中)的困难已经说了很多,所以不要指望使用正则表达式的通用解析解决方案是完美的。(另外,不要忘记语法高亮只是一种视觉辅助,你不应该过分依赖它)。

于 2012-11-29T14:32:46.950 回答