如何实现一种算法来检查 Python' 代码的缩进

How to implement an algorithm to check Python'code's indentation

我最近接受了一家当地科技公司的 Java 开发人员面试,并被要求编写一个 Java 程序来检查 python 代码中缩进的正确性(至少找到第一个缩进错误)。

处理defwhilefor可能更容易。然而,处理 if...elif...else 这样的事情是很棘手的。有不同的情况,比如只有if没有else或者elif;嵌套 ifs。如果是配对的,也许我可以使用一个堆栈,但你不知道它们是否配对。

我真的可以在这里使用一些建议。

在我看来,有两种不同的方法可以解决这个问题。

  1. 将 python 代码转换为某种类似于上下文无关文法 (CFG) 的中间格式,然后对 CFG 执行错误检查。
  2. 案例检查。

前者更优雅一些,围绕着编译器理论,或者至少是自动机理论。虽然这个过程保证有效并建立了某种人们可以参考的语言,但对于时间敏感的事情来说它可能非常乏味。这是对看似简单任务的精心修复。这种技术的优点是,如果我们正在寻找 "hacky" 解决方案,例如找到“:”,然后检查下一行是否缩进,这可能不适用于某些内联命令在 python 中使用“:”。例如 print("Enter your name:")subprocess.Popen 命令。这种情况将确保避免此类错误。

另一方面,作为程序员,后者极难跟踪,调试起来也相当困难。我以某种相对论的方式这么说,有几种情况需要检查,顶级陈述。所以让我们使用一些 "good programming practices",因为关键字 def if elif else class etc 可以存储在一个公共位置为了解决这个问题,我们声明一些变量(我们称之为 i,并读入逐行文件并检查第一个(或第零个字符)。如果该字符不是 space,我们将读取直到下一个 whitespace 并检查该单词是否存在于某些单词 Trie 中定义缩进块(您也可以使用散列,没有区别)。如果它在其中一个块中,则将 i 增加 4 并移至下一行。在后续行中,您将阅读第 i 个字符并确保它们是 spaces。本质上,您将重复此过程,直到找到与正在寻找的内容相矛盾的内容。现在,如果某些内容与我们的内容相矛盾'正在寻找,我们可能必须阅读上一行。考虑

long_sequence = [1,2,3,4,1,2,3,4,1,2,3,4, 5,6,7]

现在,这在技术上会引发错误,因此我们必须考虑这种情况以及与此类似的几种情况,其中一行比一行长,但其中的命令不完整行。

因此,如前所述,解决方案 2 将非常乏味并且是调试噩梦,解决方案 1 很优雅但很难构建。这确实取决于您必须构建它的时间表。