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

时间:2017-06-28 21:41:35

标签: java python algorithm indentation

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

处理defwhilefor可能更容易。但是处理if...elif...else之类的事情很棘手。有不同的情况,例如,只有if没有elseelif;嵌套if。如果它是配对的,也许我可以使用堆栈,但你不知道它们是否配对。

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

1 个答案:

答案 0 :(得分:1)

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

  1. 将python代码转换为某种类似于无上下文语法(CFG)的中间格式,然后对CFG执行错误检查。
  2. 案件检查。
  3. 前者更优雅,围绕编译器理论,或者至少是Automata理论。虽然这个过程可以保证工作并建立了人们可以参考的某种语言,但对时间敏感的东西来说可能是非常繁琐的。这是一个复杂的解决方案,看起来似乎是一个简单的任务。这种技术的优点是,如果我们正在寻找一个“hacky”解决方案,比如找到“:”,然后检查下一行是否缩进,这可能不适用于python中的某些内联命令使用“:”。一个示例可以是print("Enter your name:")subprocess.Popen命令。这种情况将确保避免这样的错误。

    另一方面,后者非常难以作为程序员跟踪并且调试它将是相当困难的。我在一些相对论的测量中说这个,有几种情况需要检查,顶级声明。因此,让我们使用一些“良好的编程实践”,因为关键字def if elif else class etc可以存储在一个公共位置。为了解决这个问题,我们将声明一些变量(让我们称之为i,然后读入逐行写入并检查第一个(或第0个字符)。如果字符不是空格,我们将读取直到下一个空格并检查该单词是否存在于定义缩进块的一些单词中(您可以使用哈希同样,没有区别。)如果它在一个块中,你将i增加4并继续到下一行。在随后的行中,你会读到第i个角色并确保它们是空间。基本上,你会重复这个过程,直到你发现一些与正在寻找的东西相矛盾的东西。现在,如果某些东西与我们正在寻找的东西相矛盾,我们可能必须阅读前一行。考虑

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

    现在,这在技术上会抛出一个错误,所以我们必须考虑这种情况和几个类似的情况,其中有一条线比一条线长,但命令在一条线上没有完成。

    所以,如前所述,解决方案2将是非常繁琐和调试的噩梦,1优雅,但很难构建。它确实取决于你必须构建它的时间线。