2008-08-19

Python i małe sprostowanie

Zamierzałem napisać komentarz w poprzednim poście, ale sporo informacji bardziej na posta się nadaje.

Stara opinia o Pythonie jak słusznie zauważył SirMike w komentarzu jest bardzo stara :) Prawdę mówiąc patrząc na datę - rok 2000 w moim umyśle wydał się odległy o jakieś 2-4 lat ;) Taka mini blokada umysłowa, potem ten komentarz uzmysłowił mi, że przecież faktycznie to aż 8 lat :)

Własnego języka skryptowego nie zamierzam robić. Choć nie wytłumaczyłem do czego mi ten parser ;) Parsuje po prostu własny format plików opisu, bo np. XML jak dla mnie jest nadmiarowy. Inspiracją był po trosze Python, oczywiście nie jest to ostateczny kształt:

class brzydal(Movable):
  float stopien_brzydactwa = 0.5
  str dialog = "nie lubi!"
  int wielkosc
  bool spi = false
  script zachowanie = "brzydal.py"
variant duzy_brzydal:
  stopien_brzydactwa = 1

Po przejrzeniu co rynek oferuje wśród języków skryptowych wybór padł na to samo o czym myślałem od (prawie) zawsze - na Pythona. A jego użytkownikiem będę ja ;) Muszę przyznać, że mam zakusy na przedwczesną optymalizację i czasem marnuję grube godziny na poszukiwanie idealnego rozwiązania, żeby się okazało, że to co znalazłem na początku jest tym czego szukałem ;)

2008-08-16

Parsowanie i skrypty

Implementacja Data-Driven ciąg dalszy ;)

Niezastąpiony framework do robienia parserów: Boost Spirit. Jak wiele innych bibliotek Boosta całość znajduje się w nagłówkach, więc nie ma potrzeby linkowania dodatkowych bibliotek. W skrócie umożliwia on definiowanie gramatyki języka bezpośrednio w kodzie c++. Prosty przykład:

rule<> keywords = str_p("class")
  | "variant"
  | "scene"
  | "bool"
  | "float"
  | "int"
  | "str";
rule<> symbol = lexeme_d
  [
    ((alpha_p | '_')
    >> *(alnum_p | '_'))
      -keywords
  ];
Wzięty z mojego kodu. Ten kawałek kodu to zasada na symbole (czyli wg. mojej skromnej wiedzy nazwy deklarowane przez nas). Dopuszczamy takie symbole jak w c++. Pierwszy znak to litera (alpha_p) lub (|) dolny myślnik. Kolejnych (>>) znaków może być 0 albo więcej (*) i mogą one być literą lub cyfrą (alnum_p) lub dolnym myślnikiem. Nie może również konfliktować z słowami kluczowymi, więc na końcu od możliwego wyniku odejmujemy keywords.

Kolejną biblioteką Boosta jaką wykorzystałem jest Boost Iostreams, również w nagłówku. Umożliwia ona proste tworzenie własnych strumieni. Ja wykorzystałem ją do zrobienia strumienia czerpiącego z PhysicsFS. Przykładowy kod, który znalazłem.

Generalnie przekonałem się również (wreszcie?) do używania std::stringa, zamiast standardowego const char*, m.in. ze względu na jego automatyczne współdzielenie referencji, prostotę i co było dla mnie najważniejsze - unordered_map tworzy hashe z niego automatycznie.

Aktualnie zastanawiam się nad wyborem języka skryptowego. Od początku myślałem o Pythonie, ale po przeczytaniu tej, choć już starej, opinii zacząłem się zastanawiać, czy ten wybór będzie dobry. Poszukam jeszcze wbudowanych szybkich kompilatorów C (jak polecono w przytoczonym linku) i podejmę decyzję. Tworzenie własnego języka skryptowego nie wchodzi w grę :P

Dodatkowe linki na ten temat