面向对象的设计模式用于解析文本文件?

时间:2012-01-23 23:09:29

标签: oop parsing design-patterns file-io

作为我正在处理的软件包的一部分,我需要为特定于应用程序的文本文件实现解析器。我已经在纸上指定了这些文件的语法,但我很难将其转换为易于阅读/更新的代码(现在只需通过大量的switch语句传递每一行)。

那么,在Java风格的OO环境中实现解析器是否有任何好的设计模式?

3 个答案:

答案 0 :(得分:5)

任何简单的方法来打破大规模切换到OO设计都将是

伪代码

class XTokenType {
     public bool isToken(string data);
}

class TokenParse {
     public void parseTokens(string data) {
          for each step in data {
               for each tokenType in tokenTypess {
                    if (tokenType.isToken(step)) {
                         parsedTokens[len] = new tokenType(step);
                    }
                    ...
               }
          }
          ...
     }
}

在这里,您将每个switch语句分解为该令牌对象上的方法,以检测该字符串的下一位是否属于该令牌类型。

此前:

class TokenParse {
     public void parseTokens(string data) {
          for each step in data {
               switch (step) {
                    case x: 
                         ...
                    case y:
                         ...
                    ...
               }
          }
          ...
     }
}

答案 1 :(得分:1)

一个建议是创建属性文件,您可以在其中定义规则。在运行时加载它并使用if if循环(因为switch语句在内部也是如此)。这样,如果要更改一些解析规则,则必须更改.property文件而不是代码。 :)

答案 2 :(得分:0)

您需要学习如何表达无上下文语法。您应该考虑GoF解释器和解析器/生成器,如Bison,ANTRL,lex / yacc等。