5

Przede wszystkim jako ćwiczenie edukacyjne, piszę maszynę wirtualną, asembler i kompilator od zera, w zależności od narzędzi zewnętrznych.Zasoby dotyczące przekształcania drzewa składni na zespół?

Wierzę, że mam przyzwoite konceptualne zrozumienie działania wirtualnej maszyny i asemblera, a także niektórych części kompilatora.

Oto, co chcę wiedzieć: W kompilatorze, przypuśćmy, że zmieniłem kod źródłowy na drzewo składniowe. W jakim procesie przechodzę, aby przekonwertować drzewo składniowe na zespół?

(Załóżmy, że kilka prostych konstrukcji językowych, jak wtedy, gdy. Szukam minimalną i proste wyjaśnienie tutaj).

Nie jestem szczególnie zainteresowany kompleksowych rozwiązań, lub rozwiązania oparte na istniejących narzędzi . Chciałbym raczej czegoś na wzór 1-stronicowego, obszernego opisu idei stojących za drzewem składni do montażu.

Ktoś wie o takim źródle?

Dzięki :)

+0

Pewnie. Druga i trzecia strona rozdziału 1 każdej książki kompilującej. Ale myślę, że masz nadzieję, że to wszystko, czego potrzebujesz, i to nie jest długa szansa. Problem polega na tym, że tłumaczenie języków proceduralnych na * dobry * kod maszynowy (nawet na maszynę wirtualną) wymaga dużej ilości maszyn, a podczas gdy te 2 strony dają niejasne pojęcie o tym, co jest potrzebne, nie będzie można budować wszelkiego rodzaju sensownego generatora kodu bez czytania pozostałych 200 stron książki kompilatora. –

Odpowiedz

6

Obowiązkowe odpowiedź na pytanie kompilatora jest przeczytać książkę Smoka (kompilatory: zasady, techniki i narzędzia). Kiedy mówisz, że zmieniłeś kod źródłowy na drzewo składniowe, co dokładnie masz na myśli? Zwykle pierwszym etapem parsowania jest utworzenie abstrakcyjnego drzewa składni (AST). Następnym krokiem jest zwykle zrobienie atrybucji. Atrybuty są właściwościami węzłów w AST, które niekoniecznie mają coś wspólnego z językiem źródłowym, ale są niezbędne do generowania kodu. Zwykle odbywa się tutaj pewna forma sprawdzania typów, aby określić wymagania dotyczące wielkości pamięci, a w językach obiektowych - jaką funkcję należy wywołać. Na przykład, jeśli źródłem jest obj1 = obj2 + obj3, nie wiesz, co zrobić z znakiem plus, dopóki nie określisz typu obj2.

Tak, aby dać szansę na odpowiedź na twoje pytanie. 1) Przetestuj kod źródłowy na AST. 2) Czy przypisanie na AST. 3) Wygeneruj kod pośredni (co wyobrażasz sobie, że mówisz o zespole).

Rozdziały 5 i 6 książki Smoka obejmują to szczegółowo. Naprawdę trudnym zadaniem jest ustalenie, jakie atrybuty są potrzebne do generowania kodu. Ponadto istnieją pewne trudne kwestie dotyczące instrukcji if. Na przykład, jeśli warunek if zawiedzie, wiesz, że musisz przeskoczyć jakiś kod, ale przynajmniej na początku nie wiesz, jak daleko. Powrót patcha jest jednym z rozwiązań tego problemu.