如何在源代码中正确定位不平衡的括号?

时间:2014-08-19 16:44:09

标签: c emacs syntax

最近我了解到一些文本编辑器具有检查文件中所有括号是否均衡的功能。 (例如Emacs中的check-parens)。它甚至可以突出显示第一个不平衡的括号(如果有的话)。但是我不清楚是否有一种方法可以正确定位它,而不是总是突出显示第一次不平衡的发生。

请考虑以下代码:

void foo()
{
  int some_num0 = 0;
  {
    int some_num1 = 1;
    {
      int some_num2 = 2;
      { 
        int some_num3 = 3;  
        //ops I forgot to close this block.
    }   
  }
}

一个简单的平衡检查(例如Emacs中的检查 - parens)将带我进入foo定义的开头大括号。然而,一个更合理的指示应该把我带到最里面的某个地方,一个靠近some_num3的地方。有没有办法实现这个目标?

4 个答案:

答案 0 :(得分:3)

括号检查基本上读取代码并在计数器到达括号时更新计数器。如果它是一个开口括号,它会增加1;如果是收盘价,则加-1(减1)。如果计数器遇到负数,则会出现问题,它会告诉您。如果在代码末尾,计数器不为零,那么也存在问题;那就是你的情况。

但是你怎么想让它知道丢失的支架究竟在哪里?做一些接近你想要的事情的唯一方法是检查缩进。但是如果你的代码没有正确缩进呢?

我不知道在检查括号时检查缩进的任何工具,我怀疑有一个好的(如果有的话)。

事实是,你越忘记括号,最重要的是,你编写的代码越多,你就越记得不要忘记这些括号。或者至少,它可能会发生。

所以,不要因为没有理由而责怪你的IDE,而是责怪你没有立即找到丢失的括号。并编写代码。

答案 1 :(得分:2)

一些流行的Emacs库包括但不限于:

以下是我对highlight-parentheses使用的函数之一进行的最近修改的链接,该修改将在使用scroll-upscroll-downmwheel-scroll时保留叠加层:https://stackoverflow.com/a/25269210/2112489

这是一个指向高亮括号的修改版本的链接,这是我使用的:https://stackoverflow.com/a/23998965/2112489我还没有更新parens-mode的发布版本以包含对引用的滚动的修改到上一个链接。我个人的偏好是添加/删除叠加层,而不是将它们存储在缓冲区的开头并移动它们。

以下是高亮括号的修改版本的屏幕截图:

Example http://www.lawlist.com/images/parens_mode_example.png

答案 2 :(得分:0)

如果你将所有关闭括号缩进一级,你是否仍然会说第4个开口括号更合理?

如果没有,也许应该检查一致的缩进。

答案 3 :(得分:0)

不是真正的check-parens解决方案,但是当我遇到类似这样的事情时,我通常会标记整个块并转到M-x indent-region让emacs尝试正确缩进所选区域。

在你的简单情况下,它会将它们缩进所有一个级别(MRAB答案),你只需要关闭最后一个括号。

在更复杂的情况下,缩进会在某处断开(即代码看起来不像你期望的那样),这通常是缺少括号的地方。