2011-11-04 20 views
7

Zanurzyłem już stopy w funkcjonalnym programowaniu; Jestem zaznajomiony (choć nie biegły) z Haskell i PLT Scheme. Użyłem PLT Scheme do budowy małych interpretatorów dla języków zabawek (odwołując się do PLAI) - Lepiej z językami imperatywnymi.Interpreter oparty na Prologu

Czy ktoś może skierować mnie do zasobów można używać zbudować mały interpreter języka zabawka mojego wyboru z Prologu?

+0

Czy chcesz utworzyć język, w którym zaimplementujesz środowisko wykonawcze dla tego kodu bajtowego, czy też chcesz stosować podejście meta-interpretera? –

+0

@ Niezwykle Nieskończona, chciałem zastosować metainterpreter.Alternatywa, o której wspomniałeś, wydaje się nieco zbyt duża, biorąc pod uwagę mój brak doświadczenia. – arkate

Odpowiedz

7

Używam głównie swi-prolog więc większość tego, co powiem będzie swi-prolog powiązane. Jednak inne implementacje prologu mogą mieć podobne predykaty/biblioteki (być może z nieco inną nazwą), więc możesz przeszukiwać swoje instrukcje i je znajdować. Poza tym piszę w prologu kompilator, nie tłumacz, więc może niektóre części nie są tak powiązane z tłumaczeniem.

SWI-Prolog's documentation site jest naprawdę dobre dla znalezienia rzeczy: użyj pola wyszukiwania, aby znaleźć żadnego predykatu czy typowy wyszukiwanie. Istnieje mnóstwo bibliotek, ale możesz chcieć zaimplementować kilka rzeczy, aby zdobyć doświadczenie. Możesz na nowo wymyślić koło, ale byłoby to przydatne.

Książka "The Art of Prolog" (Sterling, Shapiro) ma rozdział poświęcony budowie kompilatora w prologu (i jest to dobra książka również dla prologów).

Może są jakieś narzędzia równoważne lex/bison dla prologu; nigdy tak naprawdę nie szukałem.
Imho, lexer jest dość łatwy w zwykłym prologu; w naturalny sposób będzie oparty na dopasowywaniu wzorców.

Dla parsera sugeruję użycie DCG: gramatyki klauzul definiujących: swi-prolog doc, google po więcej szczegółów.
Problem polega na tym, że będziesz musiał przeanalizować cały plik (lub przynajmniej nie znalazłem sposobu, aby to zrobić inaczej). Btw, lexer można również zrobić z DCG, ale nie sądzę, że jest naprawdę lepszy.

Jeśli chcesz mieć kodu pośredniego, drzewo składniowe jest łatwe do wytworzenia z parsera (można ocenić wiele rzeczy podczas parsowania zbyt).
O kontrolach semantycznych: w moim kompilatorze dla języka zabawek wykonuję większość kontroli semantycznych (zakres związany, wywołania funkcji) podczas parsowania, a resztę w osobnym kroku. To trochę niechlujny

inne przydatne rzeczy: check dochodzić/1, zmienne globalne, meta predicates (maplist/[2-6]).
nie czysta prolog i można zrobić swój kod za imperatyw nadużywając ich (i wtedy można mieć kilka naprawdę nieprzyjemnych skutków ubocznych)

na tablicy symboli (jeśli jest to potrzebne) można po prostu użyć dochodzić/1, aby dodać predykaty: SWI-Prolog wykorzystuje dynamiczne tabele mieszania dla dynamicznych orzeczników. ostrzeżenie: predykaty dynamiczne są wolniejsze niż statyczne, więc gdy wypełnisz tabelę i nie wprowadzisz żadnych zmian, użyj polecenia compile_predicates/1, aby stały się statyczne. Na przykład, gdy kończę analizowanie, mój ST jest gotowy, więc go skompiluję. Innym rozwiązaniem dla ST jest użycie association lists. są one implementowane z drzewami AVL, więc koszt wynosi O (log (N)).

5

Markus Triska (here jego strona główna) pokazuje kilka rzeczy, które mogą Cię zainteresować: na przykład toy LISP, lub niektóre zadają problemy z meta interpreters.

+0

A ze względu na naturę Internetu ta odpowiedź jest martwa, link do archiwum org ... https://web.archive.org/web/20121221085328/http://web.student.tuwien.ac.at/~e0225855 – oPless

+2

@oPless: dziękuję, dostosowałem linki – CapelliC