This shows you the differences between two versions of the page.
Next revision | Previous revision Last revision Both sides next revision | ||
fordprog:plang2017 [2017/09/20 17:30] deva created |
fordprog:plang2017 [2017/10/02 16:56] deva |
||
---|---|---|---|
Line 7: | Line 7: | ||
Az alábbi példaprogram a bemeneten kapott nemnegatív egész szám legkisebb valódi osztóját számolja ki. | 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/plang2017-tesztfajlok.zip|letölthetőek]]! | + | Tesztfájlok [[http://deva.web.elte.hu/fordprog/plang-2017-osz-tesztfajlok.zip|letölthetőek]]! |
<code> | <code> | ||
- | ** A legkisebb valodi oszto meghatarozasa. | + | # A legkisebb valodi oszto meghatarozasa. # |
PROGRAM oszto | PROGRAM oszto | ||
VALTOZOK: | VALTOZOK: | ||
Line 44: | Line 44: | ||
* az angol abc kis és nagybetűi | * az angol abc kis és nagybetűi | ||
* számjegyek (0-9) | * számjegyek (0-9) | ||
- | * ''():+-*<>=_;.#'' | + | * ''():+-*/%<>=_#'' |
* szóköz, tab, sorvége | * szóköz, tab, sorvége | ||
* megjegyzések belsejében pedig tetszőleges karakterek állhatnak | * 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. | + | 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 === | === Kulcsszavak === | ||
- | A nyelv kulcsszavai a következők: ''program'', ''begin'', ''end'', ''natural'', ''boolean'', ''true'', ''false'', ''div'', ''mod'', ''and'', ''or'', ''not'', ''skip'', ''if'', ''then'', ''else'', ''endif'', ''while'', ''for'', ''in'', ''do'', ''done'', ''read'', ''write'' | + | 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 === | === 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. | + | A változók nevei, illetve a program neve kis- és nagybetűkből és számjegyekből állhatnak, de nem kezdődhetnek számjeggyel, és nem ütközhetnek egyik kulcsszóval sem. |
=== Típusok === | === 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 | + | * ''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 |
- | * ''boolean'': egy bájton kell ábrázolni; értékei: ''false'', ''true'' | + | * ''LOGIKAI'': egy bájton kell ábrázolni, értékei: ''HAMIS'', ''IGAZ'' |
=== Megjegyzések === | === 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 ''#'' 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 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. | + | 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 == | == 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. | + | 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 == | == 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. | + | * ''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. |
- | * ''boolean'' típusú kifejezések: ''true'' és ''false'', ''boolean'' 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 boolean 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. | + | * ''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ő: | * Az infix operátorok mind balasszociatívak és a precedenciájuk növevő sorrendben a következő: | ||
- | * ''and'' ''or'' | + | * ''VAGY'' |
+ | * ''ES'' | ||
* ''='' | * ''='' | ||
* ''<'' ''>'' | * ''<'' ''>'' | ||
* ''+'' ''-'' | * ''+'' ''-'' | ||
- | * ''*'' ''div'' ''mod'' | + | * ''*'' ''/'' ''%'' |
== Utasítások == | == Utasítások == | ||
- | * ''skip'' utasítás: a változók értékeinek megváltoztatása nélküli továbblépés. | + | * ''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. | * É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.) | + | * 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 ''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.) | + | * Í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.) |
- | * 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. | + | * 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. |
- | * 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: ''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. |
- | * 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. | + |