[nem-pl] Rozszerzenia
Kamil Skalski
nazgul at omega.pl
Wed Oct 29 17:52:08 CET 2003
Wednesday 29 of October 2003 00:03, Lukasz Kaiser wrote:
> Nie ma cykli w wywolaniach rekurencyjnych rozszerzen bo one tam wystepuja
> jako funkcje a nie rozszerzenia i nie ma problemu. Jesli zalozysz ze
> nie uzywasz rozszerzen przed ich kompilacja i dolaczeniem jako plik to w
> ogole te problemy powinny zniknac (chyba).
Dokładnie - jedyna możliwość kiedy się trzeba wykrzaczyć, to użycie w kodzie
rozszerzenia, które używa (choćby pośrednio) tego kodu (zwykłego).
> Eee, cos ty. Wiadomo, bo jest gramatyka jakas i parser wie co po czym
> nastapi i jaki typ w gramatyce ma wyrazenie top-level. No a ty chcesz moc
Tak, pewnie jednak kilka typów rozwazanych syntax tree trzebaby wprowadzić. Bo
ogolnie ja myslalem o tym co dostaja rozszerzeniajako o top-level
wyrazeniach. Jednak rozszerzenia moga, czy to przez rekurencyjny rozklad
drzewa, czy przez zaaplikowanie ich w jakies dziwne miejsca w kodzie, brac
jako parametry pewne specyficzne czesci drzewa skladniowego.
Wydaje sie, ze wprowadzenie kilku typow drzew (mniej wiecej wg gramatyki) i
zabronienie uzywania ich w roznych dziwnych miejscach powinno rozwiazac
problem interpretacji roznych napisow w [< >]. Jednak niestety parser nie ma
pojecia o typach (a moze moglby miec?).
> funkcji operujacej na drzewie skladniowym. Jesli dodasz nowy znaczek do
> opisu zmiennych , np. $x lub ?x _i_ dopiszesz ich typ, tzn np. ?x : E_if
> (lub jakas ladniejsza nazwa bazujac na gramatyce) to nie powinno byc az
> takich problemow. Wtedy tez powinno dzialac [< x : ?t : type >] (hmm,
> tylko sie dwukropki mieszaja miedzy jezykie a meta, trzeba jakis znaczek
> na meta, moze [< x : $( t : type ) >] albo cos takiego ?). Jest jeszcze
No wiec najprostsza wersja polegalaby na operowaniu czystym drzewm skladniowym
ze wszystkimi jego konstruktorami, ktore wystepuja w kompilatorze/gramatyce.
Wtedy funkcja wygladlaby
ext f tr =
match tr with
E_Assign( va, x) -> E_Assign( f va, f x)
E_Var(name, type) -> E_Var( name + "Old", type )
E_Plus(a, b) -> E_Minus( f a, f b)
....
Moze by wtedy tyle typo ile konstruktorow, zadenego problemu z parsowaniem,
nieczym...
Jest tylko jedno ale...
Programista zastanowi sie 10 razy czy zabierac sie za pisanie powyzszej
funkcji (szczegolnie jesli wziac cala mozliwa gramatyke jezyka i potrzebe
zapoznania sie z konstruktorami)
niz czegos w stylu:
ext f tp =
match tr with [
| [< va <- x >] -> def (l, r) = (f va, f x);
[< l <- r >]
| [< $(name, type) >] -> def newname = name + "Old";
[< $(newname, type) >]
| [< a + b >] -> def (l, r) = (f a, f b);
[< l - r >]
;
Klopot polega na tym, ze [< >] wymaga niezlego pomieszania jezyka z
metajezykiem, ktore w rezultacie moze by efektywnie nieczytelne.
More information about the devel-pl
mailing list