diff docs/node.txt @ 2:ff5e493bc9cb default tip

2003-01-29
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 13 Oct 2012 21:14:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/node.txt	Sat Oct 13 21:14:50 2012 +0200
@@ -0,0 +1,178 @@
+Wewnętrzna truktura drzewa parsowania
+=====================================
+
+
+Węzły
+-----
+
+Możliwych jest kilka podejść. Najbardziej bezpośrednim byłoby
+zdefiniowanie oddzielnej struktury danych dla każdej z produkcji gramatyki
+i przypisywanie symbolom powstałym z takiej produkcji takiej właśnie
+struktury danych jako wartość. Nie trzeba chyba wyjaśniać, że takie
+podejście jest bardzo uciążliwe dla człowieka.
+
+Dlatego też wybrałem początkowo inne podejście -- struktury danych
+tworzone są tylko dla niektórych symboli nieterminalnych, a mianowicie
+tych, które reprezentują pewne obiekty w sensie struktury programu, jak
+typy, zmienne, procedury, funkcje, polecenia, wyrażenia i tym podobne.
+Nadal jednak każde z nich miało swoją oddzielną strukturę danych.
+
+Ostatecznie zrezygnowałem z takiego rozdziału. Podzieliłem zbiór
+wszystkich rodzajów węzłów na podzbiory o podobnych własnościach i dla
+każdego z tych podzbiorów zdefiniowałem strukturę danych. Dodatkowe pole
+informuje o dokładnym rodzaju danego węzła.
+
+I tak otrzymałem 3 kategorie węzłow:
+
+1) Symbole -- czyli wszelkie obiekty posiadające nazwę, takie jak: typy,
+zmienne, stałe nazwane, pola rekordów, procedury, funkcje, unity, oraz sam
+program. Nie wszystkie jednak symbole koniecznie muszą mieć jakąś nazwę --
+dotyczy to głównie typów oraz niektórych zmiennych.
+
+2) Polecenia -- czyli pojedyńcze rozkazy programu, takie jak: blok,
+instrukcja skoku, instrukcja warunkowa, pętle, przypisanie, instrukcja
+wiążąca, instrukcja wyboru.
+
+3) Wyrażenia -- czyli wszystko to, co można do czegoś przypisać, co ma
+jakąś wartość, na przykład: stałe, odwołania do zmiennych i stałych
+nazwanych, wywołanie funkcji, operatory binarne, operatory unarne, etc.
+
+Pole mówiące o rodzaju węzła występuje zawsze jako pierwsze i jest zawsze
+tego samego typu -- tak aby używając rzutowania na którąkolwiek z
+kategorii węzłów wskaźnika void* można było poznać właściwą kategorię.
+
+Krawędzie
+---------
+
+Połączenia pomiędzy węzłami to po prostu wskaźniki umieszczone jako pola w
+odpowiednich strukturach danych. Ich znaczenie zależy częściowo od
+kategorii i rodzaju węzła, choć są także `uniwersalne', takie jak pola na
+komentarze.
+
+Informacja o połączeniach w drugą stronę -- to znaczy informacja o przodku
+danego węzła -- jest znacznie prostrza do przechowania i zależy tylko od
+kaztegorii węzła.
+
+1) Symbole -- mogą być potomkami wyłącznie innych symboli. Wobec tego ich
+pole `parent' jest wskaźnikiem na symbol.
+
+2) Polecenia -- mogą być potomkami inncyh poleceń (jak w instrukcji
+warunkowej lub blokowej). Jedyny przypadek gdy tak nie jest dotyczy
+instrukcji blokowej (BEGIN...END) i jest traktowany jako przypadek
+szczególny. Jeśli pole parent takiej instrukcji jest równe NULL, to
+rodzicem takiego węzła jest jakiś symbol, zapisany np. w polu symbol.
+
+3) Wyrażenia -- tutaj jest duży problem. Wyrażenia mogą wystąpić jako
+części składowe większych wyrażeń, jako parametry poleceń, a także w
+definicjach stałych nazwanych i typów.
+Ze względu na dość duży stopień komplikacji, jak i raczej niewielkie
+możliwości zastosowania, wyrażenia nie będą prawdopodobnie znały swoich
+przodków.
+
+
+Symbole
+-------
+
+SymbolNode
+	kind		Zmienna wyliczeniowa, opisuje dokładny rodzaj
+			węzła.
+			
+	name	 	Nazwa danego symbolu (z zachowaniem pierwszy raz
+			napotkanej wielkości liter).
+			
+	namespace	Tablica symboli-dzieci (zarówno w postaci tablicy
+			hashującej jak i listy dla zachowania kolejności).
+			Ma wartość NULL dla symboli nie mogących mieć
+			dzieci (bezpłodne?).  Symbole na liście mogą się
+			powtarzać. Wówczas pierwsze wystąpienie oznacza
+			tylko deklarację, a następne oznacza definicję.
+			
+	parent		Wskaźnik na bezpośredniego przodka w drzewie. Ma
+			wartość NULL dla korzenia.  Wskazuje w którym
+			miejscu symbol został zadeklarowany.
+			
+	body		Wskaźnik na węzeł instrukcji blokowej stanowiącej
+			ciało danego programu, procedury lub funkcji.
+			Także rozkaz przy którym znajduje się dana
+			etykieta. Ma wartość NULL dla pozostałych rodzajów
+			symboli.
+
+	type		Wskaźnik na symbol, w domyśle opisujący typ danego
+			węzła lub jego typ bazowy (dla innych typów). Dla
+			symboli nie mających typu ma wartość NULL.
+
+	used		Lista wskaźników do węzłów w których używany jest
+			ten symbol. Dla programu jest to lista nazw
+			podanych po nazwie.
+
+Polecenia
+---------
+
+StmtNode
+	kind		Zmienna wyliczeniowa, opisuje dokładny rodzaj
+			węzła.
+			
+	parent		Wskaźnik do instrukcji blokowej w której jest to
+			polecenie zawarte. Dla instrukcji blokowej będącej
+			ciałem programu, funkcji lub procedury -- ma
+			wartość NULL.
+	
+	label		Jeśli polecenie jest zaetykietowane jest to
+			wskaźnik do etykiety.  W przeciwnym wypadku NULL.
+
+	list		Dla instrukcji blokowej i pętli REPEAT -- lista
+			poleceń zawartych wewnątrz. Dla wywołania
+			procedury lista parametrów aktualnych. Dla
+			instrukcji wyboru -- lista wariantów CASE. Dla
+			instrukcji WITH -- lista zmiennych rekordowych.
+			Dla pozostałych węzłów NULL.
+	
+	stmt1		Dla pętli WHILE, instrukcji WITH i FOR oraz
+			wariantów CASE jest to wskaźnik do zawartego w
+			nich polecenia. Dla instrukcji warunkowej --
+			polecenia zaraz po THEN. Dla pozostałych węzłow
+			NULL.
+
+	stmt2		Dla instrukcji warunkowej -- polecenie po ELSE.
+			Dla pozostałych węzłów NULL.
+	
+	symbol		Dla instrukcji blokowej -- symbol której jest ona
+			ciałem. Dla instrukcji przypisania -- zmienna do
+			której następuje przypisanie. Dla instrukcji skoku
+			-- etykieta do której nalezy wykonać skok. Dla
+			instrukcji FOR -- licznik pętli.  Dla pozostałych
+			węzłów NULL.
+	
+	expr1		Dla instrukcji przypisania -- wyrażenie które
+			należy przypisać. Dla pętli REPEAT i WHILE --
+			warunek końca (kontynuacji) pętli. Dla pętli FOR
+			-- wartość początkowa licznika. Dla instrukcji
+			wyboru i instrukcji warunkowej -- wyrażenie
+			przełączające. Dla wariantów CASE -- wyrażenie
+			przy którym dany wariant ma zastosowanie. Dla
+			pozostałych NULL.
+	
+	expr2		Dla pętli FOR -- wartość końcowa licznika. Dla
+			pozostałych wartości NULL.
+
+Wyrażenia
+---------
+
+ExprNode
+	kind		Zmienna wyliczeniowa, opisuje dokładny rodzaj
+			węzła.
+
+	list		Dla wywołania funkcji -- lista parametrów
+			formalnych.
+	
+	expr1		Dla operatorów binarnych i unarnych -- wartość na
+			jakiej działają.
+	
+	expr2		Dla operatorów binarnych -- druga wartość na
+			jakiej działa.
+
+	symbol		Dla wywołań zmiennych i funkcji -- dana zmienna
+			lub funkcja. Dla operatora @ -- symbol którego
+			adres zwraca.
+	
+	value		Dla stałych -- właściwa wartość danej stałej.