Błądziłem przy kompilatorze wiązów, który jest napisany w Haskell.Adnotacja AST bez tabliczki rejestracyjnej w Haskell?
Chciałbym rozpocząć wdrażanie pewne optymalizacje dla niego, a część wymaga to przemierzając AST i dodawanie adnotacji „do” niektórych węzłów, takich jak ogon-zaproszeń itp
wiem, że mogę używać SYB lub uniplate, aby wykonać traversal, ale zastanawiam się, czy istnieje sposób, w jaki nie można łączyć z typami.
Więc załóżmy, że mamy kilka typów algebraicznych dla naszego AST:
data Expr = PlusExpr Expr Expr ...
data Def = TypeAlias String [String] Type ...
Gdybym pisanie boilerplate, że zrobię nowe typy tak:
data AnnotatedExpr = PlusExpr Expr Expr [Annotation] ...
data AnnotatedDef = TypeAlias String [String] Type [Annotation] ...
To jest dużo boilderplate do pisania i wydaje się, że dobrą praktyką jest unikanie tego.
mógłbym napisać coś takiego:
Data AnnotationTree = Leaf [Annotation]
| Internal [AnnotationTree] [Annotation]
Wtedy mam tylko drzewa adnotacji biegnącej równolegle do AST. Ale nie ma gwarancji, że drzewa te będą miały taką samą strukturę, więc stracimy bezpieczeństwo typu.
Zastanawiam się, czy istnieje eleganckie/zalecane rozwiązanie, aby uniknąć szablonu, ale nadal opisywać drzewo w sposób bezpieczny dla typu? Aby zastąpić każdy węzeł równoważnym, a także listę adnotacji, które później zostaną użyte w kompilacji?
W jaki sposób podejście to uogólnia się w sytuacjach, w których zamiast pojedynczego typu "Expr" mamy kilka typów wzajemnie indukcyjnych, np. załóżmy, że 'Expr' ma konstrukcję' case' zawierającą 'Pat's, ale niektóre z nich mogą być wzorami widoków, które zawierają' Expr'? – Cactus
Możesz przeskalować go odrobinę dalej z czymś takim jak 'dane Weave f g = Weave (g (Weave g f) (Weave f g))', https://gist.github.com/tel/29eb767c7cb331104537. Ogólnie rzecz biorąc, myślę, że musisz rozpocząć badanie pracy w * Initial Algebra Semantics is Enough! *, Ale jeszcze tego nie rozumiem. –
Niestety, to podejście nie działa, gdy adnotacja. Bialgebra 'f a a -> a' jest zbyt restrykcyjna, aby budować' Weave's z 'Weave' recursors. –