# Implementační dokumentace k 1. úloze do IPP 2024/2025
**Jméno a příjmení::** Roman Nečas  
**Login:** xnecasr00

---

## 1. Úvod
Skript `parse.py` je vypracovaný v jazyku Python 3.11 a implementuje analýzu zdrojového kódu jazyka SOL25. Jeho hlavným cieľom je načítať SOL25 program zo štandardného vstupu, vykonať lexikálnu a syntaktickú analýzu pomocou knižnice Lark (verzia 1.2.2), transformovať výsledný parse strom do abstraktného syntaktického stromu (AST) a následne vykonať statickú sémantickú analýzu. Ako výstup skript generuje XML reprezentáciu AST, čo umožňuje ďalšie spracovanie.

---

## 2. Popis implementácie

### 2.1 Lexikálna a syntaktická analýza
- Pre spracovanie vstupného SOL25 kódu je využitá knižnica **Lark**.
- V zdrojovom kóde je definovaná gramatika SOL25, ktorá popisuje štruktúru tried, metód, blokov, priradení a výrazov.
- Lexikálna analýza rozpoznáva identifikátory, literály (číselné, reťazcové) a kľúčové slová s dodržaním pravidiel case-sensitivity.

### 2.2 Transformácia do abstraktného syntaktického stromu (AST)
- Interná reprezentácia zdrojového kódu je vytvorená pomocou tried ako:
  - `Program`
  - `ClassDef`
  - `MethodDef`
  - `Block`
  - `Assignment`
  - A rôznych tried reprezentujúcich výrazy (napr. `LiteralExpr`, `VarExpr`, `BlockExpr`, `MessageSendExpr`)
- Transformácia prebieha prostredníctvom triedy `SOL25Transformer`, ktorá mapuje prvky parse stromu na príslušné AST uzly.

### 2.3 Statická sémantická analýza
- Skript vykonáva kontroly na úrovni zdrojového kódu ešte pred jeho interpretáciou:
  - Overenie duplicity definícií tried a metód.
  - Kontrola použitia rezervovaných identifikátorov (napr. `self`, `super`, `nil`, `true`, `false`, `class`).
  - Validácia arity metód – počet parametrov definovaných blokov musí zodpovedať počtu argumentov selektora.
  - Overenie existencie povinnej triedy `Main` a bezparametrickej metódy `run`.
- V prípade nájdenia chyby skript ukončí svoju činnosť s príslušným chybovým kódom (napr. 10, 11, 21, 22, 31, 32, 33, 34, 35, 99).

### 2.4 Generovanie XML
- Po úspešnej analýze sa AST transformuje do XML formátu pomocou knižnice `xml.etree.ElementTree`.
- Výsledný XML dokument obsahuje hierarchickú štruktúru, kde sú reprezentované triedy, metódy, bloky a priradenia, čo uľahčuje ďalšie spracovanie alebo vizualizáciu AST.

### 2.5 Špeciálne spracovanie
- Implementovaná je funkcia `flatten`, ktorá rekurzívne spracováva a "zplošťuje" zložité reťazce zasielania správ (message sends).  
- Toto riešenie umožňuje efektívnejšiu interpretáciu kompozitných volaní, napr. pre konštrukcie typu `compute:and:` a `ifTrue:ifFalse:`.

---

## 3. Použité technológie a knižnice
- **Jazyk:** Python 3.11  
- **Knižnica na lexikálnu a syntaktickú analýzu:** Lark (verzia 1.2.2)  
- **Práca s XML:** `xml.etree.ElementTree` a `xml.dom.minidom`

---

## 4. Spôsob behu a chybové hlásenia
- Skript je určený na spustenie zo štandardného vstupu a jeho spracovanie je riadené príkazovým riadkom.
- Parameter `--help` vypíše nápovedu a následne skript ukončí svoju činnosť s návratovým kódom `0`.
- Pri nesprávnom použití vstupných alebo výstupných súborov či pri syntaktických alebo sémantických chybách skript ukončí svoju činnosť s príslušným chybovým kódom, definovaným v zadaní (napr. 10, 11, 21, 22, 31, 32, 33, 34, 35, 99).

---

## 5. Záver
 Skript efektívne načíta zdrojový kód SOL25, vykoná komplexnú lexikálnu, syntaktickú aj sémantickú analýzu a následne vygeneruje XML reprezentáciu AST. Pri dodržaní formálnych požiadaviek projektu (vrátane správneho spracovania vstupov, chybových hlásení a ukončovacích kódov) predstavuje táto implementácia robustné riešenie projektu.
