Projekt zrealizowany w ramach kursu Teoria Kompilacji
Wydział Informatyki, Akademia Górniczo-Hutnicza w Krakowie.
Repozytorium zawiera kompletną implementację przetwarzania prostego języka do obliczeń macierzowych. Projekt obejmuje wszystkie podstawowe etapy budowy kompilatora/interpretera:
- analizator leksykalny (lexer),
- analizator składniowy (parser, SLY),
- budowę abstrakcyjnego drzewa składni (AST),
- analizę semantyczną (TypeChecker, wzorzec Visitor),
- interpreter (Visitor z dekoratorami, pamięć stosowa).
FUNKCJONALNOŚĆ
Lexer Rozpoznaje:
- operatory arytmetyczne i macierzowe (+ - * /, .+ .- .* ./),
- operatory przypisania i relacyjne,
- zakres :, transpozycję ',
- nawiasy, przecinek, średnik,
- słowa kluczowe (
if,else,for,while,break,continue,return,print), - funkcje macierzowe (
eye,zeros,ones), - identyfikatory, liczby, stringi.
Ignoruje białe znaki i komentarze (# ...).
Dla każdego tokenu zwraca jego typ, wartość oraz numer linii.
Parser + AST Parser buduje abstrakcyjne drzewo składni dla:
- wyrażeń arytmetycznych i relacyjnych,
- instrukcji przypisania,
- instrukcji warunkowych if-else,
- pętli for, while,
- break, continue, return, print,
- zakresów i indeksowania macierzy.
Drzewo AST wypisywane jest w formie tekstowej wyłącznie dla poprawnego składniowo wejścia.
W przypadku błędu składniowego raportowany jest numer linii wraz z informacją o błędzie.
Analiza semantyczna Wykrywa m.in.:
- niezgodne wymiary macierzy,
- operacje na niekompatybilnych typach,
- błędne parametry funkcji eye, zeros, ones,
- wyjście poza zakres (dla indeksów stałych),
- użycie break / continue poza pętlą,
- inicjalizację macierzy z wektorów o różnych rozmiarach.
Analiza nie przerywa działania po pierwszym błędzie i raportuje wszystkie wykryte niezgodności wraz z numerami linii.
Interpreter
Uruchamiany wyłącznie przy braku błędów składniowych i semantycznych.
Zaimplementowany z użyciem wzorca Visitor oraz stosowej pamięci wykonania (MemoryStack).
Obsługuje zagnieżdżone zakresy, pamięć globalną oraz przekazywanie sterowania (break, continue) z użyciem mechanizmu wyjątków.
WYMAGANIA
- Python 3.9+
- SLY
Instalacja zależności: pip install sly
Uruchomienie: python main.py example1.m
LICENCJA
Projekt udostępniony na licencji MIT License.
Możliwe jest kopiowanie, modyfikowanie, rozpowszechnianie oraz używanie w projektach prywatnych i komercyjnych pod warunkiem zachowania treści licencji.
============================================================
Project developed as part of the Theory of Compilation course
Faculty of Computer Science, AGH University of Krakow.
The repository contains a full implementation of a simple matrix-oriented language processing pipeline. The project covers all fundamental stages of compiler/interpreter construction:
- lexical analyzer (lexer),
- syntactic analyzer (parser, SLY),
- abstract syntax tree (AST) construction,
- semantic analysis (Visitor-based TypeChecker),
- interpreter (decorator-based Visitor, stack-based memory model).
FUNCTIONALITY
Lexer Recognizes:
- arithmetic and element-wise matrix operators (+ - * /, .+ .- .* ./),
- assignment and relational operators,
- range operator :, transpose operator ',
- parentheses, comma, semicolon,
- keywords (
if,else,for,while,break,continue,return,print), - matrix constructor functions (
eye,zeros,ones), - identifiers, integers, floating-point numbers, strings.
Ignores whitespace and comments (# ...).
For each token, it returns the token type, lexeme value, and line number.
Parser + AST The parser builds an abstract syntax tree for:
- arithmetic and relational expressions,
- assignment statements,
- conditional statements (if-else),
- for and while loops,
- break, continue, return, print,
- ranges and matrix indexing.
The AST is printed in textual form only for syntactically correct input.
In case of a syntax error, the parser reports the corresponding line number and an error message.
Semantic Analysis Detects, among others:
- incompatible matrix dimensions,
- operations on incompatible types,
- invalid parameters for eye, zeros, ones,
- out-of-range indexing (for constant indices),
- use of break / continue outside loops,
- matrix initialization using rows of inconsistent sizes.
The analysis does not stop after the first error and reports all detected issues along with line numbers.
Interpreter
Executed only if no syntax or semantic errors are detected.
Implemented using a decorator-based Visitor pattern and a stack-based runtime memory model (MemoryStack).
Supports nested scopes, global memory, and control flow transfer (break, continue) via exceptions.
LICENSE
This project is released under the MIT License.
You are free to copy, modify, distribute, and use the software in private and commercial projects, provided that the original license text is preserved.