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 C++ erősen leegyszerű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 letölthetőek!
// A legkisebb valodi oszto meghatarozasa. int main() { unsigned a; unsigned i; unsigned oszto; bool vanoszto; cin >> a; vanoszto = false; i = 2; while( !vanoszto && i < a ) { if( a % i == 0 ) { vanoszto = true; oszto = i; } i = i+1; } if( vanoszto ) { cout << vanoszto; cout << oszto; } else { cout << vanoszto; } }
A forrásfájlok a következő ASCII karaktereket tartalmazhatják:
(){}+-*/%<>!&|=_;
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.
A nyelv kulcsszavai a következők: int
, main
, unsigned
, bool
, true
, false
, if
, else
, while
, cout
, cin
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.
unsigned
: 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őjelbool
: egy bájton kell ábrázolni; értékei: false
, true
A /
/
karakterektő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 szignatúrából, deklarációs részből és törzsből áll. A szignatúra tartalma: int main()
. A szignatúrát a deklarációs rész követi, amely lehet üres is. A törzs legalább egy utasítást tartalmaz.
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.
unsigned
típusú kifejezések: számkonstansok, unsigned 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 felépített kifejezések.bool
típusú kifejezések: true
és false
, bool
típusú változók, és két unsigned
típusú kifejezésből az ==
(egyenlőség), <
(kisebb), >
(nagyobb) infix operátorral, valamint az ezekből &&
(konjunkció), ||
(diszjunkció), ==
(egyenlőség) infix és a !
(negáció) prefix operátorral és zárójelekkel felépített kifejezések.&&
||
==
<
>
+
-
/
%
=
operátorral. Baloldalán egy változó, jobboldalán egy - a változóéval megegyező típusú - kifejezés állhat.cin » 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 az eax
(logikai típus esetén az al
) regiszterben lesz.)cout « 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 ( feltétel ) { utasítások }
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.if( feltétel ) { utasítások }
vagy if( feltétel ) { utasítások } else { utasítások }
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.