文本处理的正式方法

时间:2013-03-15 17:23:21

标签: algorithm computer-science compiler-theory automata

在编码面试中,我被问到下一个问题:

  

编写一个程序,计算输入流中的单词和行数       假设你有一个方法nextChar()的读者。

乍一看,它看起来很简单。但是你意识到,你需要处理很多状态,比如:

  • 连续的字/行分隔符
  • 不同的词尾条件 - 单词分隔符或行分隔符或EOF
  • 以字词分隔符开头的新字符串

在采访中,我想出了一些带有许多if-else和旗帜的spagetti代码。

但我认为应该有一种正式的方法解决这类问题,这可以保证你处理所有可能的情况,并且可以提供结构化的解决方案。

我认为它可能来自自动机理论,也可能来自编制者理论(我之前从未深入研究过这两个领域中的任何一个)。

所以,如果你在上面的问题中发现了某种类型的问题,或者你知道哪个理论涵盖了这样的问题,请告诉我。

1 个答案:

答案 0 :(得分:4)

Finite state machines

这实际上是一项很小的lexing任务。解决方案永远不会很好,但如果你用以下方式编写代码,你就会对正确性充满信心:

curState <- NONE
while(c <- getChar)
    switch(curState) {
       case NONE:
           switch(c) {
               // ....
           }
           break;
       // .....
    }
}

您还可以使用数据结构来存储转换函数(给定状态和字符,下一个状态是什么?)但是对于您的情况,只编写代码可能是最好的选择。

...不要忘记你的文字编码! UTF-16,对吧? :)

您可能希望了解Unix wc实用程序的实现:

这些将比你在采访中所做的更加精致和有特色,但无论如何都很好看。