|
Popis programu
Program se skládá z 2 hlavních částí.
První je LexAnalyzator. Jak již název napovídá, tato třída má za úkol načíst soubor, pomocí konečného deterministického automatu rozložit na různé elementy reprezentovány pomocí jednotlivých tříd.
Specifickou úlohu zde má třída LEX_space a LEX_note, ta zahrnuje veškeré mezery (tabulátory, mezerníky) a odřádkování (0x0A i 0x0D). LEX_note jsou poznámky v kódu. Tato třída je pro samotný syntaktický překlad značně nevhodná a tak se schovává do jiné třídy, která jí předchází. Jedinou vyjímkou je počáteční poznámka/mezera, resp. jejich posloupnost je vložena do prvního jiného lexikálního elementu.
Ty formátovací znaky nejsou v průběhu překladu zanedbány, ale pomocí třídy SpacesManager vkládány na místa jim odpovídající.
Pochopitelně se zde objevuje otázka, zda by nebylo lepší nově vzniklý kód znovu zformátovat. To jsem ovšem nechtěl a snažil se dodržet co nejvíce z půdovodního projektu.
Proto existují místa, kde formátování neodpovídá půdovním představám programátora, neboť došlo k "prohození" různých částí, viz:
procedure ... var a:integer;... begin => void ... { ... int a;
Program má po celou dobu překladu známou posloupnoust lexikálních prvků. Je to z důvodu, aby syntaktický analyzátor mohl vyznačit případné nalezení chyby a to bylo vnesedo do html kódu.
Druhá část je vlastně třída Translator, která dostane jako vstup posloupnost lexikálních elementů. Ty jsou postupně načítány a postupně se vytváří strom vnitřní reprezentace.
Zápis do výstupních souborů (*.cpp, *.h) se uskutečnuje ve vlnách, první přichází po načtení definic, zde se zapíše začátek, definice jsou doplněny o načtené knihovny a překlad pokračuje i s těmito definicemi. Další a poslední krok zápisu přichází až po vytvoření stromu, nedojde-li k chybě (nalezení).
Samotný program obsahuje asmozřejmě mnohem více tříd. Lze ovšem říci, že ostatní je nepodstatné popisovat, neboť jejich význam je patrný již z jeho názvu (např. For, LEX_???, ToCPlusPlus ap..)
|
|
|