User Tools

Site Tools


fordprog:plang2017

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

===== A beadandóhoz használandó programozási nyelv leírása (Plang, 2017 ősz) ===== A félév során az alábbi programozási nyelvhez kell fordítóprogramot írni //flex// és //bisonc++// segítségével. A nyelv egy oktatási célokra készített, egyszerű, imperatív programozási nyelv. Az alábbi példaprogram a bemeneten kapott nemnegatív egész szám legkisebb valódi osztóját számolja ki. Tesztfájlok [[http://deva.web.elte.hu/fordprog/plang-2017-osz-tesztfajlok.zip|letölthetőek]]! <code> # A legkisebb valodi oszto meghatarozasa. # PROGRAM oszto VALTOZOK: EGESZ a EGESZ i EGESZ oszto LOGIKAI vanoszto UTASITASOK: BE: a vanoszto := HAMIS i := 2 CIKLUS AMIG NEM vanoszto ES i < a HA a % i = 0 AKKOR vanoszto := IGAZ oszto := i HA_VEGE i := i+1 CIKLUS_VEGE HA vanoszto AKKOR KI: vanoszto KI: oszto KULONBEN KI: vanoszto HA_VEGE PROGRAM_VEGE </code> ==== A nyelv definíciója ==== === Karakterek === A forrásfájlok a következő ASCII karaktereket tartalmazhatják: * az angol abc kis és nagybetűi * számjegyek (0-9) * ''():+-*/%<>=_'' * szóköz, tab, sorvége * megjegyzések belsejében pedig tetszőleges karakterek állhatnak Minden más karakter esetén hibajelzést kell adnia a fordítónak. A nyelv case-sensitive, azaz számít a kis és nagybetűk közötti különbség. === Kulcsszavak === A nyelv kulcsszavai a következők: ''PROGRAM'', ''PROGRAM_VEGE'', ''VALTOZOK:'', ''UTASITASOK:'', ''EGESZ'', ''LOGIKAI'', ''IGAZ'', ''HAMIS'', ''ES'', ''VAGY'', ''NEM'', ''SKIP'', ''HA'', ''AKKOR'', ''KULONBEN'', ''HA_VEGE'', ''CIKLUS'', ''AMIG'', ''CIKLUS_VEGE'', ''KI:'', ''BE:'' === Azonosítók === A változók nevei, illetve a program neve betűkből és számjegyekből állhatnak, de nem kezdődhetnek számjeggyel, és nem ütközhetnek egyik kulcsszóval sem. === Típusok === * ''EGESZ'': négy bájtos, előjel nélküli egészként kell megvalósítani; konstansai számjegyekből állnak, és nincs előttük előjel * ''LOGIKAI'': egy bájton kell ábrázolni, értékei: ''HAMIS'', ''IGAZ'' === Megjegyzések === A ''#'' karakteretől a következő ''#'' karakterig. Megjegyzések a program tetszőleges pontján előfordulhatnak, és akár több sorosak is lehetnek. A fordítást és a keletkező programkódot nem befolyásolják. === A program felépítése === A ''PROGRAM'' kulcsszóval kezdődik (amit egy tetszőleges azonosító, a program neve követ) és a ''PROGRAM_VEGE'' kulcsszóval fejeződik be. (Ezek előtt illetve után csak megjegyzések állhatnak.) A változódeklarációk a program elején találhatóak, és a ''VALTOZOK:'' szöveg vezeti be őket. A deklarációs rész opcionális, de ha a ''VALTOZOK:'' szöveg megjelenik, akkor legalább egy változót deklarálni kell. A deklarációk után a program utasításai következnek, ezt a részt az ''UTASITASOK:'' szöveg vezeti be, és legalább egy utasítást tartalmaznia kell. == Változódeklarációk == Minden változót a típusának és nevének megadásával kell deklarálni, több azonos típusú változó esetén mindegyikhez külön ki kell írni a típust. == Kifejezések == * ''EGESZ'' típusú kifejezések: számkonstansok, ''EGESZ'' típusú változók és az ezekből a + (összedás), - (kivonás), * (szorzás), / (egészosztás), % (maradékképzés) infix operátorokkal és zárójelekkel a szokásos módon felépített kifejezések. * ''LOGIKAI'' típusú kifejezések: az ''IGAZ'' és ''HAMIS'' literálok, ''LOGIKAI'' típusú változók, két ''EGESZ'' típusú kifejezésből az = (egyenlőség), < (kisebb), > (nagyobb) infix operátorokkal előállított, valamint az ezekből ''ES'' (konjunkció), ''VAGY'' (diszjunkció), = (egyenlőség) infix és a ''NEM'' (negáció) prefix operátorral és zárójelekkel a szokásos módon felépített kifejezések. * Az infix operátorok mind balasszociatívak és a precedenciájuk növevő sorrendben a következő: * ''VAGY'' * ''ES'' * ''='' * ''<'' ''>'' * ''+'' ''-'' * ''*'' ''/'' ''%'' == Utasítások == * ''SKIP'' utasítás: a változók értékeinek megváltoztatása nélküli továbblépés. * Értékadás: az '':='' operátorral. Baloldalán egy változó, jobboldalán egy - a változóéval megegyező típusú - kifejezés állhat. * Olvasás: A ''BE:'' utasítás a megadott változóba olvas be egy megfelelő típusú értéket a standard bementeről. (Megvalósítása: meg kell hívni a ''be'' eljárást, amit a negyedik beadandó kiírásához mellékelt C fájl tartalmaz. A beolvasott érték ''EGESZ'' típus esetén az ''eax'', ''LOGIKAI'' típus esetén az ''al'' regiszterben lesz.) * Írás: A ''KI:'' utasítás a megadott kifejezés értékét a standard kimenetre írja (és egy sortöréssel fejezi be). (Megvalósítása: meg kell hívni a ''ki_egesz'' (vagy a ''ki_logikai'') eljárást, amit a 4. beadandó leírásához mellékelt C fájl tartalmaz. Paraméterként a kiírandó értéket (mindkét esetben 4 bájtot) kell a verembe tenni.) * Ciklus: ''CIKLUS AMIG'' //feltétel utasítások// ''CIKLUS_VEGE'' alakú. A feltétel logikai kifejezés. A ciklus belseje lehet üres is. A megszokott módon, elöltesztelős ciklusként működik. * Elágazás: ''HA'' //feltétel// ''AKKOR'' //utasítások// ''HA_VEGE'' vagy ''HA'' //feltétel// ''AKKOR'' //utasítások// ''KULONBEN'' //utasitasok// ''HA_VEGE'' alakú. A feltétel logikai kifejezés. Az egyes ágak lehetnek üresek is. A megszokott módon működik.

fordprog/plang2017.1506352611.txt.gz · Last modified: 2017/09/25 17:16 by deva