2013-05-27 9 views
10

Czy można użyć Instaparse lub innej biblioteki Clojure do analizy języka opartego na wcięciach? Widziałem przykłady użycia Instaparse do parsowania gramatyk wyrażonych w EBNF/ABNF. Czy istnieje dobry sposób na wykorzystanie go do analizy języka z wcięciem, takiego jak Python?Czy mogę analizować język oparty na wcięciach przy użyciu Instaparse lub innych bibliotek clojure?

+0

@chollida: Próbuję uzyskać porady na temat tego problemu, zamiast robić coś bardzo hacky. –

+0

Nie dostaniesz czegoś hackowego, ponieważ napisałeś trochę o tym, co próbujesz osiągnąć. – octopusgrabbus

+0

@octopusgrabbus: Nie jestem pewien co masz na myśli. Moim opcjom, jak je widzę, jest ręczne przetasowanie mojego parsera (hacky) lub użycie generatora parsera, którego Instaparse wydaje się najlepiej rozwinięty.Ale nie było dla mnie oczywiste, jak sformułować gramatykę opartą na wcięciach w A/EBNF, czy też Instaparse będzie odpowiednim narzędziem. Stąd pytanie. –

Odpowiedz

10

Wygląda na to, że nie jesteś pierwszą osobą, która ma ten problem z Instaparse.

W przypadku większości generatorów analizatorów składni problem można rozwiązać za pomocą niestandardowego leksytera, stosując pewne odmiany schematu zaproponowanego przez @andrewcooke. Jednak Instaparse został zaprojektowany w celu uniknięcia potrzeby stosowania leksykonu, w związku z czym nie zapewnia interfejsu, który je wykorzystuje.

Ten brak został specjalnie podniesiony w issue 9, zastąpiony przez issue 10; w tym ostatnim artykule autor Instaparse sugeruje obejście:

W międzyczasie istnieje obejście, które można potencjalnie zastosować. Możesz odwzorować żetony takie jak INDENT i DEDENT na nieużywane postacie, a następnie odbudować je jako ciąg, a następnie uruchomić instaparse. Uważam, że znaki ASCII 0-8 i 11-31 są nieużywane i mogą służyć jako tokeny.

Jest to z pewnością możliwość, choć jest to ocena estetyczna, czy to "robić coś bardzo hacky." Mimo to możesz napisać taki hack w nadziei, że można go usunąć po rozwiązaniu problemu 10. Możesz dołączyć do dyskusji na ten temat.

+0

Przez hacky, głównie chodziło o ręczne toczenie parsera. To wygląda obiecująco, postaram się to dalej. Wielkie dzięki. –

8

zazwyczaj zrobić parsowanie wcięcia oparte potrzebne są trzy rzeczy:

  • rozciągają tokenizera aby token z czołowych miejsc na każdej linii

  • proces strumieniu tokenów dla każdego wiersz porównujący początkowe spacje z bieżącym kontekstem i wskazujący na wzrost lub spadek (zmieniając mając token na początku każdej linii na token, gdy zmienia się poziom wcięć )

  • zapisywanie "normalnego" analizatora składni, który jest świadomy tokenów wskazujących zmianę poziomu wcięcia .

w zależności od języka, który może być potrzebny do przekazania informacji z części trzeciej do drugiej.

ja nie wiem nic o instaparse (I tylko dlatego odpowiadam jest to, że ludzie, którzy pytają: „co ty próbowałeś do tej pory?” Na takie pytania naprawdę wkurzaj mnie), więc trzeba by Sprawdź, czy istnieje jakiś sposób na umieszczenie drugiego etapu między tokenizerem a analizatorem składni (skanowałem dokumenty i nie wydaje się, aby zawierało ono część drugą, ale możesz sam to napisać). ale powinno być w stanie zrobić pierwszą i trzecią część w porządku.

+0

Dzięki, jest to bardzo pomocne. –

+1

+1 za "naprawdę wkurza mnie" na bok. :) –

Powiązane problemy