# 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.