62 lines
3.8 KiB
Markdown
62 lines
3.8 KiB
Markdown
# 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.
|