2012-01-23 12 views
5

Jako część pakietu oprogramowania, nad którym pracuję, muszę zaimplementować analizator składni dla plików tekstowych aplikacji. Już określiłem gramatykę dla tych plików na papierze, ale mam trudny czas na przetłumaczenie go na kod, który można łatwo odczytać/aktualizować (teraz przechodzi każdą linię przez ogromną liczbę instrukcji przełączania).Obiekty zorientowane obiektowo na parsowanie plików tekstowych?

Czy istnieją zatem dobre wzorce projektowe do implementacji analizatora składni w środowisku OO w stylu Java?

+1

Parsery są jednym z przykładów, w których naprawdę funkcjonuje styl funkcjonalny. Biblioteki kombinatoryjne parserów są pod najbardziej ekspresywnymi. Spójrz na Parask Haskella lub Boost.Spirit. – pmr

Odpowiedz

5

łatwy sposób złamać masywny przełącznik do wzoru OO byłoby mieć kod

pseudo

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); 
        } 
        ... 
       } 
      } 
      ... 
    } 
} 

tutaj swoje łamanie każdego przełącznika oświadczenie do metody na tym symbolicznym obiektem w celu wykrycia, czy następny kawałek łańcucha jest tego typu tokena.

Poprzednio:

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

Po prostu to, czego szukałem :) – zergylord

+0

@Zergylord, jeśli twój fan GoF może to być nazywane wzorcem poleceń, ale to może być kłamstwo – Raynos

0

Musisz nauczyć się wyrażać gramatykę bez kontekstu. powinno być myślenie o GOF Tłumaczka i parser/generatorów jak bizony, ANTRL, lex/yacc itp

1

Jedna z propozycji jest stworzenie pliku właściwości, gdzie można zdefiniować reguły. Załaduj go w czasie wykonywania i użyj, jeśli w innych pętli (ponieważ instrukcje switch również robią to samo wewnętrznie). W ten sposób, jeśli chcesz zmienić niektóre reguły parsowania, musisz zmienić plik .property, a nie kod. :)

Powiązane problemy