Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

Podobné dokumenty
Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Programovací jazyk Pascal

Překladač a jeho struktura

Poslední aktualizace: 14. října 2011

Lexikální analýza Teorie programovacích jazyků

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Semestrální práce z předmětu Teorie programovacích jazyků

Konstruktory překladačů

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Implementace LL(1) překladů

DUM 06 téma: Tvorba makra pomocí VBA

X36UNX 16. Numerické výpočty v sh příkazy expr, bc, dc. Zdeněk Sojka

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Proměnné a parametry. predn_08.odt :00:38 1

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

ALGORITMIZACE A PROGRAMOVÁNÍ

Assembler - 5.část. poslední změna této stránky: Zpět

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

PHP tutoriál (základy PHP snadno a rychle)

Algoritmizace a programování

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

dovolují dělení velkých úloh na menší = dekompozice

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý

Uplatnění metod na zvolený jazyk

Vstupní požadavky, doporučení a metodické pokyny

LEKCE 6. Operátory. V této lekci najdete:

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Bezkontextové gramatiky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 6. května / 49

Interpret jazyka IFJ2011

Zápis programu v jazyce C#

Implementace překladače imperativního jazyka IFJ05

NPRG030 Programování I, 2015/16 1 / :25:32

C2110 Operační systém UNIX a základy programování

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Struktura programu v době běhu

pi Ludolfovo číslo π = 3,14159 e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)), např. je v Octave, v MATLABu tato konstanta e není

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

CZ.1.07/1.5.00/

TÉMATICKÝ OKRUH TZD, DIS a TIS

Úvod do programování. Lekce 1

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Úvod do programovacích jazyků (Java)

NPRG030 Programování I, 2018/19 1 / :25:37

Střední odborná škola a Střední odborné učiliště, Hořovice

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Algoritmizace a programování

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

2 Strukturované datové typy Pole Záznam Množina... 4

ZÁPOČTOVÁ PRÁCE z UIR

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

VISUAL BASIC. Práce se soubory

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

PROGRAMOVÁNÍ V SHELLU

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

Lexikální analýza. Miroslav Beneš Dušan Kolář

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PSK3-9. Základy skriptování. Hlavička

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Architektury počítačů a procesorů

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

Princip funkce počítače

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

2 Formální jazyky a gramatiky

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Programování v jazyce JavaScript

GENEROVÁNI KÓDU jazyk Mila

Odvozené a strukturované typy dat

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

MQL4 COURSE. By Coders guru -4 Operace & Výrazy

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Transkript:

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP Petr Sládek slady@slady.cz 27. ledna 2005

Zadání Cílem této semestrální práce je kontrola zdrojového kódu překladače jazyka PL/0 napsaného v PHP a zároveň sepsání dokumentace pro ostatní studenty. Záměrem autora je poskytnout budoucím studentům vhodný odrazový můstek pro jejich vlastní práci. Pokud dostanete jako semestrální práci na FJP zadání v PHP, stačí si přečíst tuto dokumentaci a už budete vědět kam sáhnout. Zbytek práce tedy bude hračka. Úvod Ke spuštění překladače napsaného v PHP potřebujete server nebo alespoň samostatný interpret, který umožňuje spouštění PHP skriptů. Jediný zádrhel může spočívat v načtení vstupního zdrojového textu většina serverů totiž není nastavena jako server katedry, takže se do proměnné $text nemusí zdrojový text PL/0 vůbec načíst. Pro zabránění těchto problémů s nastavením serveru byla přidána jedna z prvních řádek v PHP, která do proměnné $text uloží hodnotu zaslanou vstupním textovým polem s názvem text : $text = $_POST["text"]; Činnost samotného překladače není nijak zvlášť komplikovaná. Překladač se dělí na několik částí: Lexikálního analyzátor Syntaktický analyzátor Pomocné funkce, například: Práce s množinovými operacemi Práce s tabulkou proměnných Práce s tabulkou generovaného kódu Činnost překladače Překladač pracuje v jediném průchodu, při kterém provádí veškeré kontroly, generuje kód a tabulku proměnných. Není to tedy tak, že se nejprve spustí lexikální analýza, po úspěšném provedení této fáze se spustí syntaktická analýza, atd. Vše funguje v jediném průchodu. Nejprve se po spuštění kompilátoru inicializují konstanty a proměnné. Poté je spuštěn syntaktický analyzátor, který pro svůj běh potřebuje tokeny lexikálního analyzátoru. Zavolá se tedy funkce lexikálního analyzátoru pro načtení jednoho tokenu, která zase spustí funkci pro načítání ze vstupu. Když jsou všechny tokeny vstupního zdrojového textu přečteny a zpracovány, je spuštěno vygenerování cílového kódu. Lexikální analyzátor Lexikální analyzátor je první jednotka překladače, která má za úkol relativně jednoduchým způsobem získat ze vstupního zdrojového textu tzv. lexému (některý základní prvek příslušného jazyka, např. klíčové slovo if ) a tu pak vrací syntaktickému analyzátoru v globálních proměnných. Všechny možné lexémy jsou ve vstupním jazyce popsány pomocí regulárních výrazů. Kromě samotné lexémy se ukládají další související údaje, např. jakého druhu je daná lexéma (operátor, klíčové slovo, identifikátor, ) nebo pokud se jedná o číslo, pak také jeho číselná hodnota. Tato skupina údajů, předávaná z lexikálního do syntaktického analyzátoru, se označuje anglickým termínem token (česky: známka, odznak). Ve zdrojovém kódu je lexikální analýza implementována v jediné funkci: getsym()

Syntaktický analyzátor Syntaktický analyzátor (v angličtině označovaný jako parser, z to parse rozebrat, oddělovat, udělat větný rozbor) se dá považovat za mozek překladače, protože provádí samotnou analýzu vstupního jazyka. Úkolem syntaktického analyzátoru je rozpoznat, zda je program zapsán správným způsobem, např. zda na úvodní begin bude navazovat někde koncové end, ale také určuje, v jakém pořadí se budou provádět jednotlivé části příkazů, například u zápisu x+y*z rozpozná a určí, že nejdříve se bude násobit a pak až sčítat. Úloha syntaktického analyzátoru je složitější než úloha lexikálního analyzátoru, který vyhodnocoval regulární jazyk. Syntaktický analyzátor musí rozpoznávat složitější bezkontextový jazyk, musí tedy vyhodnocovat vstup v delším záběru. Používá se jeden z nejjednodušších způsobů konstrukce syntaktického analyzátoru tzv. metoda rekurzivního sestupu. V této metodě se pomocí rekurzivních volání funkcí konstruuje tabulka výstupního kódu, přičemž struktura implementace překladače odráží strukturu příslušné gramatiky. Pokud je v gramatice na daném místě neterminální symbol, v překladači mu odpovídá (rekurzivní) volání funkce reprezentující příslušný neterminál. Tato rekurzivní volání končí u terminálních symbolů (lexémů jazyka). Následuje zápis syntaxe jazyka PL/0 tak, jak odpovídá voláním názvů funkcí: program -> block. block -> [ const identifikátor = číslo {, identifikátor = číslo } ; ] [ var identifikátor {, identifikátor } ; ] [ procedure identifikátor ; block ; ] statement statement -> identifikátor := expression call identifikátor begin statement { ; statement } end if condition then statement while condition do statement e condition -> odd expression expression ( = <> < > <= >= ) expression expression -> [ + - ] term { ( + - ) term } term -> factor { ( * / ) factor } factor -> identifikátor číslo "(" expression ")" Vysvětlivky: Tučně zapsané symboly jsou neterminální symboly gramatiky Symboly zapsané kurzívou jsou složitější terminální symboly (tedy čísla a názvy identifikátorů) Obyčejným písmem jsou zapsané jednoduché terminální symboly [Výraz] v hranatých závorkách je nepovinný {Výraz} ve složených závorkách se může několikrát opakovat (tzv. iterace) Znak je symbol pro nebo Kulaté závorky oddělují části výrazu Kulaté závorky v uvozovkách jsou terminální symboly reprezentující kulaté závorky

Zvláštnosti programu množinové operace Zajímavost oproti implementaci v jazyku Pascal je absence množinových funkcí v PHP. Jedná se vlastně o bitové pole logických hodnot, se kterým je možné provádět operace jako například sčítání. V této implementaci a v implementaci v jazyku C je tato vlastnost implementována normálním polem logických hodnot. Potíží, které tato náhražka množin přináší, je několik. Nejde jednoduše pojmenovávat jednotlivé prvky, takže jsou nadefinovány konstanty indexů, kterými se přistupuje do pole. Dále je také velmi těžké sloučit dvě logická pole, takže je tu k tomu jednoduchá funkce pojmenovaná sjednot(), která k poli v prvním formálním parametru přidruží prvky z pole v druhém formálním parametru (což je vlastně sjednocení dvou logických polí). Jediná změna, kterou jsem v implementaci provedl, byla nahrazení vytváření takového logického pokaždé znovu. Namísto nulování pole je možné volat funkci nuluj(), která vrátí pole plné nul o délce třicet prvků. Popis globálních proměnných a funkcí Následuje popis nejdůležitějších globálních proměnných, datových struktur a všech funkcí programu. Globální proměnné $wsym tabulka symbolů (klíčových slov) $ssym tabulka matematických operátorů (+, -, /, <) $text $pozice $ch $id $num $sym... zdrojový kód (jeden dlouhý řetězec s kódem a oddělovači řádků)... index (ukazatel) do proměnné $text pozice ve zdrojáku... jeden znak načtený ze zdrojáku plněno funkcí getch()... jeden token načtený ze zdrojáku plněno funkcí getsym()... hodnota číselného tokenu plněno funkcí getsym()... číselná identifikace načteného tokenu (z tabulky $wsym) $cx $code Datové struktury... index (ukazatel) na vygenerovaný kód do tabulky $code... pole vygenerovaného kódu Tabulka proměnných $TABLE má položky o tomto formátu: class PrvekTabulky: $name... jméno proměnné z globální prom. $id $kind... typ položky: Kconstant, Kvariable či Kprocedure $val... číselná hodnota z globální proměnné $num $level... tzv. level zanoření procedury $adr... adresa proměnné či procedury $size... délka procedury Při každém přístupu k proměnné či při volání procedury se prohledává tato tabulka a podle jména (uloženého v položce $name) se určí index do tabulky. Pak se může načíst adresa, ze které se má číst hodnota proměnné, nebo adresa začátku procedury, na kterou se má skákat.

Tabulka $code, do které se generuje výstupní kód, má položky s tímto formátem: class INSTRUCTION: $f kód instrukce $l tzv. level úroveň operandu zanoření procedury $a adresa, na kterou se má skočit, nebo kód operace Funkce Následují všechny funkce v logickém seskupení, tedy nikoli v takovém pořadí, v jakém jsou implementované v programu. function error($n) Vypíše chybu, která se objevila v programu. function getch() Přečte jeden znak ze zdrojového textu. Uloží ho do $ch Množinové funkce function sjednot(&$s1, $s2) Náhrada množinové operace sjednocení. Nastaví příznaky v $s1, které jsou nastaveny v $s2 function test($s1,$s2,$n) Jedná se o test syntaktického analyzátoru. Testuje, zda je v $sym uloženo číslo tokenu, který je povolen v logické množině $s1 function nuluj() Vrátí nově vytvořené čisté pole logických hodnot (pole nepravda ). Práce s tabulkou proměnných function enter($k, &$tx, $lev, &$dx) Vloží jeden prvek (proměnnou nebo proceduru) z globálních proměnných ($id, $num) a lokálních ($k, $lev, $dx) do tabulky $TABLE tvořenou objekty PrvekTabulky na pozici $tx function position($id, $tx) Vyhledá symbol podle jména v tabulce symbolů $TABLE, hledá od pozice $tx dolů do nuly Generování kódu function gen($x, $y, $z) Vloží jeden prvek o hodnotách ($x, $y, $z) do pole vygenerovaného kódu $code na pozici $cx

function listcode() Generuje assembler na výstupu. Vypisuje všechny položky tabulky $code až do hodnoty indexu ($cx-1) Lexikální analyzátor function getsym() Načte jeden symbol (identifikátor, klíčové slovo, číslo) ze zdrojového textu. Uloží ho do $id Pokud se jedná o identifikátor nebo klíčové slovo, uloží do $sym číslo (kód z tabulky $wsym), nebo když se jedná o číslo, uloží jej do proměnné $num Syntaktický analyzátor function constdeclaration(&$tx, $lev, &$dx) Zpracovává definici konstanty typu const size = 8; Používá funkci enter() pro uložení hodnot. function vardeclaration(&$tx,$lev,&$dx) Zpracovává definici proměnné typu var i := 0; Používá funkci enter() pro uložení hodnot. function factor($fsys, $tx, $lev) Součást výrazu (expression), viz syntaktický analyzátor dříve. function term($fsys, $tx, $lev) Součást výrazu (expression), viz syntaktický analyzátor dříve. Volá factor() Použito pro matematické operace násobení, dělení a modulo. function expression($fsys, $tx, $lev) Výraz (expression), viz syntaktický analyzátor dříve. Volá term() Použito pro matematické operace sčítání a odčítání. function condition($fsys, $tx, $lev) Vyhodnocení logických výrazů, viz syntaktický analyzátor dříve. Volá expression() function statement($fsys, $tx, $lev) Vyhodnocení výrazů, viz syntaktický analyzátor dříve. function block($lev, $tx, $fsys) Vyhodnocení bloků příkazů, viz syntaktický analyzátor dříve.

Závěr Pokud máte konkrétní zadání na rozšíření či změnu funkčnosti překladače jazyka PL/0 v PHP a přečetli jste si tuto dokumentaci, měli byste vědět, kde se dá místo pro požadovanou změnu rychle najít. Mimo sepsání této dokumentace pro vaší snazší práci je snad můj jediný viditelný přínos do zdrojového kódu počítání čísel řádek pro oživení výpisu chybových hlášení. Zdroje [1] Domácí stránky KIV/FJP o PL/0, http://www.kiv.zcu.cz/~lobaz/fjp/fjp4.html [2] Článek Wikipedie o překladačích, http://cs.wikipedia.org/wiki/překladač [3] Implementace PL/0 v dalších jazycích, http://www.kiv.zcu.cz/~lobaz/fjp/fjp.html