User Tools

Site Tools


fordprog:plang2017

This is an old revision of the document!



Warning: Declaration of syntax_plugin_gallery::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /afs/elte.hu/user/d/deva/web/pubwiki/lib/plugins/gallery/syntax.php on line 17

Warning: Declaration of syntax_plugin_gallery::render($mode, &$R, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /afs/elte.hu/user/d/deva/web/pubwiki/lib/plugins/gallery/syntax.php on line 17

Warning: Declaration of syntax_plugin_cellbg::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /afs/elte.hu/user/d/deva/web/pubwiki/lib/plugins/cellbg/syntax.php on line 0

Warning: Declaration of syntax_plugin_cellbg::render($mode, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /afs/elte.hu/user/d/deva/web/pubwiki/lib/plugins/cellbg/syntax.php on line 0

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 letölthetőek!

** 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

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, natural, 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
  • boolean: 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.
  • 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.
  • 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/plang2017.1505921442.txt.gz · Last modified: 2017/09/20 17:30 (external edit)