User Tools

Site Tools


fordprog:while2017

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 (While, 2017 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 az oktatási célokra gyakran felhasznált While nyelv egy 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/while2017-tesztfajlok.zip|letölthetőek]]! <code> program oszto natural a; natural i; natural oszto; boolean vanoszto; begin read( a ); vanoszto := false; i := 2; while not vanoszto and i < a do if a mod i = 0 then vanoszto := true; oszto := i; endif i := i+1; done if vanoszto then write( vanoszto ); write( oszto ); else write( vanoszto ); endif end </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, 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: ''program'', ''begin'', ''end'', ''integer'', ''boolean'', ''true'', ''false'', ''div'', ''mod'', ''and'', ''or'', ''not'', ''skip'', ''if'', ''then'', ''else'', ''endif'', ''while'', ''for'', ''in'', ''do'', ''done'', ''read'', ''write'' === Azonosítók === A változók nevei betűkből, számjegyekből és ''_'' jelből állhatnak, de nem kezdődhetnek számjeggyel, és nem ütközhetnek egyik kulcsszóval sem. === Típusok === * ''natural'': 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 * ''bool'': egy bájton kell ábrázolni; értékei: ''false'', ''true'' === Megjegyzések === A ''#'' karaktertő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 szignatúrából, deklarációs részből, törzsből és befejezésből áll. A szignatúra tartalma: ''program'' //név//, ahol a //név// tetszőleges azonosító. A szignatúrát a deklarációs rész követi, majd ''begin'' kulcsszó vezeti be a törzset. A deklarációs rész lehet üres is. A törzs legalább egy utasítást tartalmaz. A befejezést az ''end'' kulcsszó jelzi. == Változódeklarációk == Minden változót //típus név// '';'' alakban kell deklarálni, több azonos típusú változó esetén mindegyiket külön-külön. == Kifejezések == * ''natural'' típusú kifejezések: számkonstansok, natural típusú változók és az ezekből a ''+'' (összedás), ''-'' (kivonás), ''*'' (szorzás), ''div'' (egészosztás), ''mod'' (maradékképzés) infix operátorokkal és zárójelekkel felépített kifejezések. * ''bool'' típusú kifejezések: ''true'' és ''false'', ''bool'' típusú változók, és két ''natural'' típusú kifejezésből az ''='' (egyenlőség), ''<'' (kisebb), ''>'' (nagyobb) infix operátorral, valamint a bool típusú kifejezésekből az ''and'' (konjunkció), ''or'' (diszjunkció), ''='' (egyenlőség) 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ő: * ''and'' ''or'' * ''='' * ''<'' ''>'' * ''+'' ''-'' * ''div'' ''mod'' == 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 ''read('' //változó// '');'' utasítás a megadott változóba olvas be egy megfelelő típusú értéket a konzolról. (Megvalósítása: meg kell hívni a ''be_egesz'' (vagy a ''be_logikai'') eljárást, amit a 4. beadandó leírásához mellékelt C fájl tartalmaz. A beolvasott érték natural típus esetén az ''eax'', logikai típus esetén az ''al'' regiszterben lesz.) * Írás: A ''write('' //kifejezés// '');'' 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 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.) * While ciklus: ''while'' //feltétel// ''do'' //utasítások// ''done'' A feltétel logikai kifejezés, a ciklusmag legalább egy utasítást tartalmaz. A megszokott módon, elöltesztelős ciklusként működik. * For ciklus: ''for'' //változó// ''in'' //kifejezés// ''..'' //kifejezés// ''do'' //utasítások// ''done'' A változónak a deklarációs részben deklarált, natural típusú változónak kell lennie, az intervallum határait jelző kifejezések szintén natural típusúak. Az intervallum határai a ciklus első iterációja előtt kiértékelésre kerülnek, és az értékük akkor sem változik meg, ha a kifejezésekben szereplő változók módosulnak. A ciklus változója az első iteráció előtt megkapja az intervallum alsó határának értékét, minden iteráció végén eggyel nő, az utolsó iterációban a felső határral egyezik meg. Ha az alsó határ nagyobb a felsőnél, a ciklus egyszer sem fut le. * Elágazás: ''if'' //feltétel// ''then'' //utasítások// ''endif'' vagy ''if'' //feltétel// ''then'' //utasítások// ''else'' //utasítások// ''endif'' A feltétel logikai kifejezés, az ágak legalább egy utasítást tartalmaznak. Az elágazások a megszokott módon működnek.

fordprog/while2017.1488308695.txt.gz · Last modified: 2017/02/28 20:04 by deva