(Disclaimer: questi esempi vengono forniti nel contesto della creazione di un compilatore, ma questa domanda riguarda esclusivamente il pattern Visitor e non richiede alcuna conoscenza della teoria del compilatore.) Sto esaminando Andrew Appel's Modern Compiler Implementazione in Java per cercare di insegnare a me stesso la teoria del compilatore (quindi no, questo non è compito a casa) e ho difficoltà a capire come vuole usare il pattern Visitor per trasformare un AST in un albero IR. (Nota: lo sto facendo in Python, quindi posso imparare anche Python, ed è per questo che gli esempi imminenti non sono in Java.) A quanto ho capito, i metodi visita e accetta nel pattern Visitor sono vidimati dalla progettazione, quindi se ho qualcosa di simileTrasformazioni albero utilizzando il pattern visitatore
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)
quindi mi piacerebbe essere in grado di scrivere un metodo come
def visit_plus_exp(self, plus_exp):
return BINOP(BinOp.PLUS,
plus_exp.exp_left.accept(self),
plus_exp.exp_right.accept(self))
visitatore che si tradurrebbe le due espressioni bambino in IR e poi collegarsi con la BINOP che rappresenta l'espressione positiva. Naturalmente, questo non è possibile a meno che non modifico tutte le funzioni di accettazione per restituire informazioni extra, e questo è anche disordinato perché a volte vuoi solo un visitatore di stampa che non restituisca nulla. Tuttavia, questo testo insiste sul fatto che un visitatore è la strada giusta da percorrere, e in Java a ciò, il che significa che può essere fatto senza la flessibilità di Python. Non riesco a pensare ad alcuna soluzione che non sia incredibilmente hacky: qualcuno può illuminarmi sul design previsto?
hey voglio anche studiare compilatori ... è quel libro un buon libro per studiare compilatori ??? –
Penso che sia abbastanza buono come introduzione. Ti guida attraverso (senza tenere la mano) l'implementazione di un compilatore che prende come sorgente un sottoinsieme di Java ed emette codice nativo. Contiene anche una serie di argomenti avanzati nella teoria del compilatore. – danben
Riguarda la parte di generazione del codice? –