2012-01-23 72 views
5

作爲我正在開發的軟件包的一部分,我需要爲應用程序特定的文本文件實現解析器。我已經在紙上指定了這些文件的語法,但是我很難將它翻譯成容易讀取/可更新的代碼(現在只是通過大量的switch語句傳遞每行代碼)。解析文本文件的面向對象的設計模式?

那麼,在Java風格的面向對象環境中實現解析器有什麼好的設計模式嗎?

+1

解析器是功能風格真正閃耀的例子之一。解析器組合庫是最具表現力的。看看Haskell的Parsec或Boost.Spirit。 – pmr

回答

5

任何簡單的方法,打破了龐大的交換機成一個面向對象的設計將有

僞代碼

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: 
         ... 
        ... 
       } 
      } 
      ... 
    } 
} 
+0

正是我在找:) – zergylord

+0

@zergylord如果你的GoF粉絲這可能被稱爲命令模式,但這可能是一個謊言 – Raynos

0

您需要學習如何表達上下文無關語法。你應該考慮GoF的解釋和解析器/發電機像野牛,ANTRL,法/ yacc的,等

1

一個建議是要創造一個你定義的規則屬性文件。在運行時加載它並使用if else循環(因爲switch語句在內部也是這樣做的)。這樣,如果你想改變一些分析規則,你必須改變.property文件而不是代碼。 :)