User Tools

Site Tools


fordprog:basic2016

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 (Basic, 2016 tavasz) ===== 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 a [[http://en.wikipedia.org/wiki/BASIC_programming_language|Basic]] egyszerűsített változata. 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/basic2016-tesztfajlok.zip|letölthetőek]]! <code> REM Legkisebb valódi osztó meghatározása INPUT a& LET i& = 2 WHILE i& < a& IF a& MOD i& = 0 THEN PRINT i& END ENDIF LET i& = i& + 1 WEND </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 Minden más karakter esetén hibajelzést kell adnia a fordítónak, kivéve megjegyzések belsejében, mert ott tetszőleges karakter megengedett. 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: ''INPUT'', ''PRINT'', ''LET'', ''IF'', ''THEN'', ''ELSE'', ''ENDIF'', ''WHILE'', ''WEND'', ''REM'', ''END'', ''NOT'' === Változók === A változók nevei betűvel kezdődnek, betűkkel és számjegyekkel folytatódhatnak és a & karakterrel kell végződniük. Valamennyi változó egész szám típusú, és nem kell deklarálni őket. === Típusok === * Egész szám típus: Négy bájtos, előjel nélküli egészként kell megvalósítani. A számliterálok számjegyekből állnak és nincs előttük előjel. Kizárólag a ''0'' számliterál kezdődhet nullával, tehát például a ''00'' és ''0987'' hibásak! * Logikai típus: Egy bájton kell ábrázolni a generált assembly kódban. Logikai típusú literálok és változók nincsenek a nyelvben, logikai típusú kifejezések viszont létrehozhatók a logikai típusú operátorok segítségével. === Megjegyzések === A REM kulcsszótól kezdve a sor végéig. Megjegyzések a program tetszőleges pontján előfordulhatnak, a fordítást és a keletkező programkódot nem befolyásolják. === A program felépítése === A program utasítások sorozatából áll, és lehet üres is. == Kifejezések == * Egész szám típusú kifejezések: számliterálok, változók és az ezekből a ''+'' (összedás), ''-'' (kivonás), ''*'' (szorzás), ''\'' (egészosztás), ''MOD'' (maradékképzés) infix operátorokkal és zárójelekkel felépített kifejezések. * Logikai típusú kifejezések: az ''='' (egyenlőség), ''<'' (kisebb), ''>'' (nagyobb), ''<''''='' (kisebb egyenlő), ''>='' (nagyobb egyenlő), ''AND'' (konjunkció), ''OR'' (diszjunkció) infix és a ''NOT'' (negáció) prefix operátorral és zárójelekkel felépített kifejezések. * Az infix operátorok mind balasszociatívak és a precedenciájuk növevő sorrendben a következő: * ''OR'' * ''AND'' * ''='' * ''<'' ''>'' ''<''''='' ''>='' * ''+'' ''-'' * ''\'' ''MOD'' * A kifejezések a szokásos módon zárójelezhetők. == Utasítások == * Értékadás: a ''LET'' kulcsszó után, az ''='' operátorral. A bal oldalon egy változó, a jobb oldalon egy egész típusú kifejezés állhat. * Az ''INPUT'' utasítás a megadott változóba olvas be egy értéket a standard bemenetről. (Megvalósítása: meg kell hívni a ''be_egesz'' eljárást, amit a 4. beadandóhoz mellékelt C fájl tartalmaz. A beolvasott érték az ''eax'' regiszterben lesz.) * A ''PRINT'' utasítás a megadott kifejezés értékét a képernyőre írja (és egy sortöréssel fejezi be). (Megvalósítása: meg kell hívni a ''ki_egesz'' vagy ''ki_logikai'' eljárást, amit a 4. beadandó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: * ''WHILE'' feltétel utasítások ''WEND'' * A feltétel logikai kifejezés, és a ciklus belsejében legalább egy utasításnak kell lennie. A megszokott módon, elöltesztelős ciklusként működik. * Elágazás: * ''IF'' feltétel ''THEN'' utasítások ''ENDIF'' * ''IF'' feltétel ''THEN'' utasítások ''ELSE'' utasitasok ''ENDIF'' * A feltétel logikai kifejezés, és az egyes ágakban legalább egy-egy utasítás van. A megszokott módon működik. * Az ''END'' utasítás terminálja a programot. (A program akkor is véget ér, ha nincs több végrehajtandó utasítás: nem kötelező, hogy a program utolsó utasítása ''END'' legyen.)

fordprog/basic2016.1456132050.txt.gz · Last modified: 2016/02/22 10:07 by deva