关于{
,}
和[
,]
和(
,)
,我真的希望能够定义syntax region
的{{1}},<
用于C ++模板的使用,如下所示:
>
但是,有没有办法创建这样一个语法区域,而不会与以下内容发生冲突:
a<b>
第一个if( a < b<c>::d )
显然是“小于”运算符,应该作为模板参数区域的开头被丢弃。
我尝试过使用多种选项但无法使其正常运行。尝试使用复杂的正则表达式来识别模板args区域而不是一个小于操作似乎是不可能的,它只能通过使用嵌套的自引用模式检查平衡对来起作用。
答案 0 :(得分:4)
根据@ ingo-karkat的回答,我对空白使用情况有了进一步的了解,我认为我有一个足够好的匹配模式可以满足(我认为这可以捕获90%以上的情况)。
syn region AngleBrackets matchgroup=AngleBracketContents
start='[[:space:]<]\@<!<<\@!'
end='>'
start
匹配{<1}} 之前的空格和<
。通过空格检查是否 是一个关键因素,因为大多数时候关系操作都会被空格包围,而且,很常见的做法是不在模板之前用空格打开括号。
我还检查是否有其他<
没有立即跟进。
这是what I'm doing的快照(区域内的操作符获取区域的颜色,嵌套区域改变颜色,它基于Rainbow括号改进,带有一些小的修正):
刚刚将我的VIM正则表达式更改为:
<
这最后一个实际上将帮助我强制执行良好的代码风格。
答案 1 :(得分:1)
只要你拍摄 80%解决方案并将<...>
内的文本限制为非空白标识符(假设你的编码风格用空格围绕比较运算符),使用:syntax match
代替:syntax region
(已经在开始匹配时触发,而不检查是否存在结束匹配),这应该有效(因为单个正则表达式必须匹配开始和结束)。 / p>
关于解析C ++(在真正的编译器中)的困难已经说了很多,所以不要指望使用正则表达式的通用解析解决方案是完美的。 (另外,不要忘记语法突出显示只是一个视觉援助,你不应该过分依赖它。)