Kompilator Kotka - dokumentacja
Kompilator powstał jako projekt laboratoryjny na przedmiocie Metody Realizacji
Języków Programowania.
Autor: Tomasz Czajka
Opis języka
Zgrubna definicja języka.
Moje rozszerzenia i założenia:
- Napisy (typ string) reprezentowane są w cudzysłowiu ("abc"). Znaki specjalne można uzyskać za pomocą standardowych sekwencji ("\n", "\t", "\013").
- Jest typ logiczny bool ze stałymi true i false.
- Zaimplementowana została obiektowa wersja języka.
- Zabronione jest przesłanianie identyfikatorów.
- Rekordy to to samo co klasy (bez metod, dziedziczą po object).
- Klasy nieglobalne nie mogą mieć metod.
- Nie trzeba specyfikować początkowej wartości w deklaracji zmiennych - wtedy przyjmowana jest standardowa wartość początkowa.
- Tablice i obiekty przekazywane są przez referencję. Domyślna wartość początkowa tablicy to tablica długości 0.
- Wyrażenia mogą zawierać operatory arytmetyczne +,-,*,/,%, relacyjne >,<,>=,<=,=,<> i logiczne !,&,|.
- Jest wyrażenie dynamicznego rzutowania: cast typ (wyrażenie).
- Sprawdzane są wszystkie błędy czasu wykonania (np. odwołanie poza
zakres tablicy).
Instalacja i uruchamianie
Potrzebny jest:
- program make
- kompilator Ocaml-a (ocamlopt)
- ocamllex i ocamlyacc
- asembler as
- linker ld
Należy rozpakować plik kotek.zip i skompilować kompilator poleceniem make. Następnie kompilację programu abc.kotek przeprowadzamy w następujący sposób:
kotek abc.kotek -- to generuje plik w asemblerze abc.S
as -o abc.o abc.S -- asembler
ld -o abc.o libkotek.o -- łączymy z biblioteką czasu wykonania (libkotek.o)
Skrypt compile wywołuje te właśnie trzy komendy.
Moduły
Utils
Różne pomocnicze funkcje.
Error
Funkcje obsługi błędów.
Syntax
Definicja typu drzewa składni programu.
Lexer
Lekser symboli kotka, generowany przez ocamllex.
Parser
Parser kotka, generowany przez ocamlyacc.
Sem
Definicja typu drzewa semantycznego programu (udekorowane drzewo składni) oraz funkcji pomocniczych.
Semantic_an
Analizator semantyczny. Przekształca drzewo składni na drzewo semantyczne. Wykrywa wszystkie błędy semantyczne. Deklaracje rozwikływane są metodą przeszukiwania wgłąb (wykrywane są cykle).
Tablica symboli używana jest tylko na tym etapie przetwarzania. Trzymana jest ona na niezmienialnym (immutable) zrównoważonym drzewie, dzięki czemu nie trzeba
martwić się usuwaniem ani przesłanianiem symboli (mimo że język zabrania przesłaniania nazw, niektóre symbole i tak są przesłaniane, np. result).
Generator
Generuje kod w asemblerze na podstawie drzewa semantycznego.
Main
Łączy program w całość.
libkotek
Biblioteka czasu wykonywania dla kotka, napisana w asemblerze. Zawiera różne użyteczne funkcje, w tym przydzielanie pamięci (malloc). Nie zostało zaimplementowane odśmiecanie pamięci - pamięć przydzielana jest po kolei bez zwalniania.