2010-08-06 13 views
14

Chciałbym napisać parser idiomatyczny dla języka znaczników, takiego jak Markdown. Moja wersja będzie nieco inna, ale dostrzegam przynajmniej niewielką potrzebę czegoś takiego w Clojure i chciałbym się z tym pogodzić.Pisanie analizatora składni (dla języka znaczników): Teoria i praktyka

Nie chcę używać bałaganu RegExes (choć zdaję sobie sprawę, że niektóre będą prawdopodobnie potrzebne) i Chciałbym stworzyć coś równie potężnego, jak i idiomatycznego Clojure.

Zacząłem kilka różnych prób (głównie na papierze), ale jestem strasznie szczęśliwy z nich, ponieważ czuję, że jestem po prostu improwizacją. Byłoby dobrze, ale w ciągu ostatniego miesiąca lub dwóch zrobiłem wiele badań w języku Clojure i chciałbym, przynajmniej częściowo, podążać ścieżkami gigantów.

Chciałbym wskazówek, sugestii lub zasobów (książki od O'Reilly byłyby niesamowite - uwielbiają mnie niektóre książki elektroniczne - ale Amazon lub wszędzie tam, gdzie byłaby świetna). Cokolwiek możesz zaoferować.

EDYTOWANIE Brian Carper ma interesujący post na using ANTLR from Clojure.

Istnieją również clojure-pg i fnparse, które są generatorami parserów Clojure. fnparse nawet wygląda na to, że ma przyzwoitą dokumentację.

Nadal szukasz zasobów itp.! Pomyślałem, że zaktualizuję je o własne odkrycia.

+1

Pytanie o zasoby kompilatora kanonicznego to [Nauka pisania kompilatora] (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler), które prawdopodobnie adresuje * trochę * twojego pytania .. – dmckee

+0

Ach, dziękuję za to przypomnienie - to jest dobra nitka, ale prawdopodobnie obejmuje * bit * więcej niż jestem zainteresowany na potrzeby tego projektu. Chociaż szukałem pretekstu do przeczytania/ćwiczenia Dragon Book & co. – Isaac

+0

Wyrażenia regularne nigdy nie są potrzebne. – strager

Odpowiedz

5

Istnieje również clj-peg projekt, który pozwala określić gramatykę PEG w celu analizowania danych

+0

Ah, to całkiem miłe. Ładne znalezisko! Rozważam to. – Isaac

+0

Zacząłem sprawdzać źródło (po przejrzeniu dokumentów) i wydaje się, że to może być odpowiedź. Od lutego nie jest aktualizowany, o ile widzę. Wysłałem e-mail do człowieka, który go napisał, i zapytałem, czy może być zainteresowany wetknięciem go na GitHub. Dzięki za wskazówkę! – Isaac

+0

Wysłał mi e-mail z powrotem, mówiąc, że wkrótce nadejdzie ważna aktualizacja/przepisywanie! FYI – Isaac

6

Najlepsze co mogę myśleć to to, że Terrence Parr - facet, który prowadzi ANTLR parser generator - napisał język znaczników udokumentowany here. W każdym razie jest tam kod źródłowy do obejrzenia.

+0

Interesujące - muszę to sprawdzić. Niestety, napisane w Javie, ale niektóre z pomysłów na pewno będą miały zastosowanie, nawet jeśli styl nie jest. (Zauważyłem mnóstwo klas "wypełniaczy", ale hej, tak to robisz - po prostu trudniej je sobie wyobrazić w funkcjonalnym języku.) – Isaac

+0

Cóż, czy to prawda? Java-interop jest doskonały, czemu nie napisać interfejsu API clojure dla ANTLR? Wygląda na to, że wiele projektów może przynieść korzyści ... – mcpeterson

+0

To prawda, ludzie mogą, ale w ciągu ostatniego miesiąca miałem więcej niż mój udział w pakowaniu bibliotek Java. Czas na odrobinę więcej Just Clojure ™. Z pewnością jest to jednak coś, o czym muszę pamiętać! – Isaac

2

Dwa funkcjonalne tłumaczy znaczników są;

+0

Dzięki! To są dobre zasoby. Mój Haskell jest trochę słaby, ale mogę go zrozumieć, ale mój OCamle jest nieistniejący. Dzięki! – Isaac

4

Kolejny nie wymieniony tutaj jest clarsec, port biblioteki parsec Haskella.

Niedawno uczestniczyłem w bardzo podobnym zadaniu, aby utworzyć parser w Clojure. Przeszedłem dość daleko ścieżką fnparse, w szczególności za pomocą (jeszcze nie wydanego) fnparse 3, które można znaleźć w gałęzina github. Jest podzielony na dwie formy: hound (specjalnie dla parserów LL (1) single overhead) i cat, który jest parserem packrat. Oba są funkcjonalnymi parserami zbudowanymi na monadach (jak clarsec). fnparse ma imponującą pracę - umiejętność dokumentowania twojego parsera, budowania komunikatów o błędach itp. jest zadowalająca. Dokumentacja dotycząca gałęzi rozwijającej się nie istnieje, ale nie zawiera funkcji docstrukcji, które są całkiem dobre. Na koniec uderzyłem kilka bloków drogowych próbując sprawić, żeby LL (k) działało. Myślę, że jest to możliwe, aby działało, jest po prostu ciężko, bez przyzwoitego zestawu przykładów, jak zrobić dobry backtracking. Jestem również zaznajomiony z parserami, które dzielą leksykowanie i analizowanie, że trudno mi tak myśleć. Nadal jestem bardzo zainteresowany tym, jako dobrym rozwiązaniem w przyszłości.

W międzyczasie powróciłem do Antlr, który jest bardzo solidny, dobrze podróżował, dobrze udokumentowany (w 2 książkach), itp. Nie ma backlooka Clojure, ale mam nadzieję, że będzie w przyszłości, co sprawi, że będzie to naprawdę miłe dla pracy z parserem. Używam go do lexing, parsowania, transformacji drzewa i szablonów za pomocą StringTemplate. To nie było całkowicie bezbłędne, ale udało mi się znaleźć praktyczne rozwiązania wszystkich problemów. Unikalny algorytm LL (*) parsowania Antlr pozwala pisać dobrze czytelne gramatyki, ale nadal sprawiają, że są dość wydajne (i stopniowo zmieniają rzeczy, jeśli nie są).

+0

Bardzo interesujące. Zajmę się tym również. Zajrzę znowu do Antlr, ale myślę, że chciałbym pomóc jeszcze bardziej ulepszyć istniejący parser Clojure. – Isaac

Powiązane problemy