(Uwaga: te przykłady podano w kontekście budowania kompilatora, ale to pytanie dotyczy wzorca gościa i nie wymaga znajomości teorii kompilatorów.) Przechodzę przez stronę Andrew Appela Nowoczesna implementacja kompilatora w Javie, aby spróbować nauczyć się teorii kompilatora (więc nie, to nie jest praca domowa) i mam problem ze zrozumieniem, w jaki sposób chce wykorzystać wzorzec Odwiedzający, aby przekształcić AST w drzewo IR. (Uwaga: robię to w Pythonie, więc mogę również nauczyć się Pythona, dlatego nadchodzące przykłady nie są w Javie.) Jak rozumiem, metody odwiedzin i akceptacji w wzorzec Visitor są puste-typowane według projektu, więc jeśli mam coś podobnegoTransformacje drzewa przy użyciu wzorca odwiedzającego
class PlusExp(Exp):
def __init__(self, exp_left, exp_right):
self.exp_left = exp_left
self.exp_right = exp_right
def accept(self, v):
v.visit_plus_exp(self)
następnie Chciałbym móc napisać metodę odwiedzających jak
def visit_plus_exp(self, plus_exp):
return BINOP(BinOp.PLUS,
plus_exp.exp_left.accept(self),
plus_exp.exp_right.accept(self))
co przełożyłoby dwóch wyrażeń dziecko w podczerwieni, a następnie połączyć je z BINOP reprezentujący wyrażenie plus. Oczywiście nie jest to możliwe, dopóki nie zmodyfikuję wszystkich funkcji akceptujących, aby zwrócić dodatkowe informacje, a to jest również kłopotliwe, ponieważ czasami po prostu chcesz drukowanego użytkownika, który niczego nie zwraca. Tekst ten twierdzi jednak, że odwiedzający to właściwa droga, a na tym w Javie, co oznacza, że można to zrobić bez elastyczności Pythona. Nie mogę wymyślić żadnych rozwiązań, które nie są niewiarygodnie hackowe - czy ktoś może mnie oświecić, jeśli chodzi o projekt?
hej Chcę również uczyć się kompilatorów ... czy ta książka to dobra książka do nauki kompilatorów ??? –
Myślę, że to całkiem dobre wprowadzenie. Przeprowadza cię przez procesor (bez trzymania ręki) przez implementację kompilatora, który pobiera jako źródło podzbiór Javy i emituje natywny kod. Zawiera również szereg zaawansowanych tematów w teorii kompilacji. – danben
Czy obejmuje część generowania kodu? –