【问题标题】:How to properly locate unbalanced parenthesis in source code?如何正确定位源代码中的不平衡括号?
【发布时间】:2014-10-12 20:52:35
【问题描述】:

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

考虑下面的代码:

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 中的 check-parens)将带我进入 foo 定义的左括号。然而,更合理的指示应该将我带到最内层附近的某个地方,即 some_num3 附近的那个。有没有办法做到这一点?

【问题讨论】:

  • 您是否特别希望仅在 Emacs 中执行此操作?你想为它写你自己的脚本,还是你问是否有内置的东西?还是您更笼统地问这个任务的算法是什么样的?

标签: c emacs syntax


【解决方案1】:

括号检查基本上是读取代码并在遇到括号时更新计数器。如果是左括号,则加 1 ;如果它是关闭的,它会加 -1(减 1)。如果计数器碰到负数,那就是有问题,它会告诉你。如果在代码末尾,计数器不为零,则也有问题;那是你的情况。

但是您如何希望它知道缺少的大括号实际上在哪里?做一些接近你想要的事情的唯一方法是检查缩进。但是如果你的代码没有正确缩进怎么办?

我不知道有什么工具可以在检查大括号时检查缩进,我怀疑是否有一个好的工具(如果有的话)。

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

所以,不要责怪你的 IDE 没有被赋予理性,而要责怪你没有立即找到丢失的括号。并编写代码。

【讨论】:

  • 不错的评论。我问这个是因为我通常必须对分配给我的一些意大利面条代码进行同行检查,或者在结对编程的过程中。
  • 就我自己而言,我很少遇到缺少括号的问题。我总是自动添加它们 - 我成对添加它们,然后开始内容插入。
  • 哦,我现在更了解您的需求了。您的代码注释//ops I forgot to close this block. 让我认为您是忘记了一些括号的人。无论如何,祝你的意大利面条代码好运。
【解决方案2】:

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

这是我最近对高亮括号使用的函数之一所做的修改的链接,当使用 scroll-upscroll-downmwheel-scroll 时,它将保留覆盖:https://stackoverflow.com/a/25269210/2112489

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

这里是高亮括号修改版本的屏幕截图:


(来源:lawlist.com

【讨论】:

    【解决方案3】:

    如果你将所有右大括号都缩进一级,你还会说指示第 4 个左大括号更合理吗?

    如果不是,也许它也应该检查一致的缩进。

    【讨论】:

      【解决方案4】:

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

      在您的简单情况下,它会将它们全部缩进一级(MRAB 回答),您只需关闭最后一个大括号。

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

      【讨论】:

        【解决方案5】:

        我刚刚将 notepad++ 与 BracketsCheck 插件 https://community.notepad-plus-plus.org/topic/14090/best-way-to-find-unmatched-parentheses/2 一起使用。在搜索和尝试 VSCode 插件几个小时后,n++ 为我做到了 :) 我正在检查一个包含大约 270 个公式表达式的 2.5K 行 XML 文件。使用通常的匹配括号突出显示功能逐个检查括号公式看起来不是一个很好的选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-16
          • 1970-01-01
          相关资源
          最近更新 更多