2013-03-20 16 views
5

Piszę narzędzie z własnym wbudowanym językiem podobnym do Pythona. Chcę, aby wcięcie było znaczące w składni (aby tabulatory i spacje na początku linii reprezentowały zagnieżdżanie poleceń).Jak napisać język z wcięciem podobnym do Pythona w składni?

Jaki jest najlepszy sposób na zrobienie tego?

Pisałem już wcześniej parser rekursywny i skończone automaty.

+0

Proponuję zmienić tytuł tego pytania, jest to bardzo mylące ze strony listy. Być może wspomnij o "zewnętrznej zasadzie" – forivall

+0

@ forwardall done! :) –

+1

Co z aktualnym tytułem? Myślę, że jest znacznie lepiej! :) – ulidtko

Odpowiedz

5

Obecny CPython „s parser seems to be generowane za pomocą czegoś, co nazywa ASDL.

Odnośnie wcięcie prosisz, it's done pomocą specjalnego lexer żetony nazywa INDENT i DEDENT. Aby to powielić, po prostu zaimplementuj te żetony w twoim lexer (to całkiem proste, jeśli używasz stosu do przechowywania początkowych kolumn poprzednich wciętych linii), a następnie podłącz je do swojej gramatyki jak zwykle (jak każde inne słowo kluczowe lub token operatora) .

+0

To miło ... ale chcę tylko wybrać odpowiednią technikę, aby napisać to sam. –

+0

@oleg, zobacz dokumenty Pythona, które mam powyżej. Używają dwóch specjalnych tokenów, INDENT i DEDENT. – ulidtko

+0

hm ... To ma sens. mój zły, nie pomyślałem o tym pierwszy :) –

0

Zapoznaj się z python compiler, aw szczególności z compiler.parse.

+0

To nie jest o python ... Chodzi o składnię Pythona. Jest po prostu podobny do tego. komendy nie są w python. Po prostu ludzki czytelny język ... –

0

Proponuję ANTLR dla każdej generacji lekseterów/parserów (http://www.antlr.org).

Ponadto, ta strona (http://erezsh.wordpress.com/2008/07/12/python-parsing-1-lexing/) ma trochę więcej informacji, w szczególności:

wcięcie Pythona nie może być rozwiązany z DFA. (Wciąż jestem zakłopotany, czy można to nawet rozwiązać za pomocą gramatyki bezkontekstowej).

pypy produkowane ciekawy post na temat Lexing Pythonie (zamierzają rozwiązać go za pomocą post-przetwarzania wyjściu Lexer)

tokenizer CPython jest napisany w C. ad-hoc, odręcznie, a skomplikowane. Jest to jedyna oficjalna implementacja Python lexing, o której wiem, że jest to .

+1

Jakiś czas temu pisałem parser dla prostej implementacji języka C, był to parser rekursywny. Nie potrzebuję niczego skomplikowanego. To około 30 poleceń. –

Powiązane problemy