作爲我正在開發的軟件包的一部分,我需要爲應用程序特定的文本文件實現解析器。我已經在紙上指定了這些文件的語法,但是我很難將它翻譯成容易讀取/可更新的代碼(現在只是通過大量的switch語句傳遞每行代碼)。解析文本文件的面向對象的設計模式?
那麼,在Java風格的面向對象環境中實現解析器有什麼好的設計模式嗎?
作爲我正在開發的軟件包的一部分,我需要爲應用程序特定的文本文件實現解析器。我已經在紙上指定了這些文件的語法,但是我很難將它翻譯成容易讀取/可更新的代碼(現在只是通過大量的switch語句傳遞每行代碼)。解析文本文件的面向對象的設計模式?
那麼,在Java風格的面向對象環境中實現解析器有什麼好的設計模式嗎?
任何簡單的方法,打破了龐大的交換機成一個面向對象的設計將有
僞代碼
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:
...
...
}
}
...
}
}
您需要學習如何表達上下文無關語法。你應該考慮GoF的解釋和解析器/發電機像野牛,ANTRL,法/ yacc的,等
一個建議是要創造一個你定義的規則屬性文件。在運行時加載它並使用if else循環(因爲switch語句在內部也是這樣做的)。這樣,如果你想改變一些分析規則,你必須改變.property文件而不是代碼。 :)
解析器是功能風格真正閃耀的例子之一。解析器組合庫是最具表現力的。看看Haskell的Parsec或Boost.Spirit。 – pmr