|
Úvod
Tato práce je psána jako semestrální projekt a zároveň jako semestrální práce předměnu Programovací jazyky a překladače.
Cílem semestrálního projektu bylo vytvoření překladače z jazyku Pascal do jazyku C++.
V praxi by mohl být překlad do jazyka C. C++ bylo zvoleno pouze z toho důvodu, že Pascal obsahuje OOP, což C nikoli. Pochopitelně tato semestrální práce neobsahuje celý jazyk pascal a tudíž ani OPP, ale z výhledem do budoucna je výsledkem pro jistotu C++.
Během psaní této semestrální práce se objevily jisté nesrovnalosti, a sice, že v jistých detailech se jednotlivé vývojové prostředí pascalu liší (Borland Pascal, Turbo Pascal, Free Pascal..) a proto je v jednotlivých konstrukcích popsáno o jakou variantu jde, celkově se jedná o TP, ale protože jsem využíval převážně FP, mohli nastat odchylky od TP...
Program se skládá z lexikální a syntaktického překladače. Lexikální analyzátor je navržen tak, aby přečetl jakýkoliv smysluplný kód v pascalu. Jeho výstup je použit jak pro syntaktický analyzátor, tak zároveň generuje obarvený kód v html. Do html je zaneseno i zvýraznění chyby (může se jednat o chybu detekovanou v lexikálním analyzátoru tak i chyby ze syntaktického analyzátoru (nenalezen očekávaný lexikální prvek ap.).
Obarvený text by měl bez problémů pracovat se všemi konstrukcemi. Navíc je zde vložen prvek zabalování cyklů, recordů, objektů a složených příkazů.
Při vytváření samotného syntaktického analyzátoru jsem se snažil hledat jednoduché příklady v pascalu a ty postupně "oživovat". Tím pádem obsahuje tento překladač podle mého nejdůležitější konstrukce. Některé však byli předem vyloučeny, jako například vnořené funkce a procedury, type a konstanty uvnitř procedur a funkcí. Samotné vytvoření těchto konstrukcí v C++ by nebylo nikterak náročné. Stačilo by tyto věci napsat vně a pro jistotu přejmenovat, ale je to jakási obklika, která mi nepřišla až tak důležitá vzláště k vzhledem jejich četnosti použití...
Překladač umí překládat celé projekty s tím, že uvažuje o tom, že veškeré knihovny jsou k dispozici v jazyku pascal a vyhovují omezením překladače. Pokud neni soubor nalezen pokracuje preklad s tim, že tuto knihovnu ignoruje a spoléhá na náhradu překladačem. Ta se děje na 2 úrovních. První je taková, že překladač použije některou s funkcí jazyka c++ (např. printf). Druhou variantou je, že se použije předem napsaná funkce, eliminující vlastnosti jazyka pascal. K tomu slouží knihovna p2cpp.h. Zde jsou funkce pro spojování řetezců, formátování výstupu až po některé z vybraných funkcí knihovny crt.pas, jako jsou textcolor, readkey ap.
Co se týče samotných vlastních konstrukcí jazyka pascal, omezil se překladač na jistou podmnožinu.
Překladač například nepoužívá vlasnosti, jakými jsou omezení čísel do rozsahu, sady ap. Jedná se o dost konkrétní věci, které nemají ovšem žádný významný důsledek.
Překladač umí procedury, funkce, cykly (repeat-until, while, for), podmineny příkaz, složený příklad, výrazy se všemi základními typy (neumí record/pole=record/pole). Přesto že neumí pracovat se sadami, byla sem vložena jedna podmnoživa sad a to pro dosti časté použití operátoru in. Může tedy být ve výrazu operátor in s přímo vloženou sadou (např. if a in [0..4,6]).
Co se týče proměnných, umí plnohodnotně pracovat se všemi triviálními typy, String, record a pole.
U výrazů, krom práce s sežitějšími typy (record, pole) umí vše i přístup skrze tyto typy.
Překladač při překladu výrazu vytváří celý strom výrazu, protože pascal narozdíl od c nerozlišuje mezi logickým a binární operací (viz. AND, OR..).
V rámci překladu výrazu bere v úvahu i odlišnost priorit, což je řešeno závorkami.
Program umí i překládat indexování polí a stringů. To řeší pomocí snižování indexů o počáteční hodnotu. Dokáže tedy i pole, které používají záporné indexy a v rámci rozdílů mezi řetězci v c++ a TP posouvá index o 1.
Program se snaží přeložit i assembler. Problém je ovšem v tom, že pascal "zná" pouze 16-bitový assembler a visuál studio pro které byl program napsán zase pouze 32bitový v chráněném režimu.
Překladač tedy vlastně kopíruje tělo bloků asm. U funkcí se navíc snaží přeložit i vrácení návratové hodnoty, ale překlad pascala do určitého vývojového prostředí C++ by potřeboval zvlštní překlad, což jsem vrámci této práce raději vynechal.
Protože jsem nenalezl žádný vhodný kompromis, upravil jsem vše pro VisualC++. V rámci této práce jsou odevzdány vytvořené projekty v VC++ z přiložených ukázkových kódů...
Další specifickou částí jsou nepodmíněné skoky. Překladač přečte label a názvy návěští, avšak v rámci programu tyto skoky nahlásí jako chybu (je to právě kvůli návěštím v asm).
Konkrétní specifikace všech známých konstukcí je v rámci gramatiky... (nebo by se dalo říci, že překladač umí vše to co používají přiložené zdrojové kódy...)
|
|
|