Zkouška C++ 11.2.2026
Naprogramujte interpret jednoduchého procedurálního jazyka XXP.
Popis XXP
Příklad programu pro výpočet faktoriálu v XXP:
; factorial PAR=10 COUNTER=1 FACT=1 ; result ; loop FACT = FACT * COUNTER COUNTER=COUNTER+1 TMP = PAR - COUNTER TMP ? 5 ; if( PAR != COUNTER) goto loop ; end
Zdrojový kód je řádkově orientovaný, jeden příkaz na jedné řádce. Vše od znaku ; (středník) do konce řádky se ignoruje. Všechny bílé znaky (mezera, tab) se ignorují.
Řádky jsou číslovány od 0, do číslování se započítávají všechny řádky včetně prázdných.
Číslo je posloupnost číslic. Všechna čísla jsou celočíselná, předpokládejte, že se vejdou do int, testy na přetečení nejsou nutné.
Identifikátor proměnné je posloupnost písmen, proměnné jsou case-sensitive. Proměnná může obsahovat pouze celé číslo, neinicializovaná proměnná má hodnotu 0. Příkaz je buď přiřazení nebo podmíněný skok.
Přiřadit proměnné lze buď hodnotu (tj. číslo nebo obsah jiné proměnné) nebo dvě hodnoty spojené operátorem. Složitější výrazy nejsou podporovány. Příkaz skoku otestuje hodnotu před znakem ?. V případě, že je nenulová, jako další se provede řádka s číslem odpovídajícím hodnotě za znakem ?. Pokud je hodnota nulová, program pokračuje následujícím řádkem.
Syntax:
<Number> ::= {Digit}*
<Identifier> ::= {Letter}*
<Value> ::= <Number> | <Identifier>
<Operator> ::= '+' | '-' | '*' | '/'
Assignment:
<Identifier> = <Value>
<Identifier> = <Value> <Operator> <Value>
Jump:
<Value> ? <Value>
Zadání
Naprogramujte interpret jazyka XXP, který načte zdrojový kód ze souboru uvedeného jako jediný parametr příkazové řádky nebo ze standardního vstupu, pokud program žádné parametry nemá.
Vnitřní forma načteného programu může být libovolná, efektivita opakovaného provádění příkazů není podstatná. Je však nutné efektivně přistupovat k proměnným a jejich hodnotám.
Interpretace začíná na řádku 0 a končí tehdy, pokud by měla být prováděna neexistující řádka (korektní běh), anebo v případě výskytu jakékoliv chyby (chybový běh).
V případě korektního běhu interpret vypíše v lexikografickém uspořádání název a obsah všech definovaných proměnných ve tvaru
Hello=20 X=17 na každé řádce jedna proměnná.
V případě chybového běhu program vypíše na standardní výstup text error a (za mezerou) číslo řádky, na které byla chyba detekována.
Za chybu je považován pokus o interpretaci jakékoliv řádky, která nevyhovuje výše uvedené syntaxi. Je nutné detekovat jakékoliv odchylky od syntaxe interpretovaných řádek.
Řádky, které se neprovádí, není nutné kontrolovat. V případě výskytu chyby před spuštěním interpretace první řádky program vypíše error 0.
Pro výše uvedený program interpret vypíše:
COUNTER=10 FACT=362880 PAR=10 TMP=0
Hodnotící kritéria a testy Funkčnost, stabilita, efektivita, dekompozice, rozhraní, čitelnost a celkově kvalita zdrojových kódů.
Vaše řešení důkladně otestujte, obzvláštní péči věnujte ošetření syntakticky nesprávného kódu.
Testy 01-03 obsahují syntakticky korektní XXP kód
TEST 01
; factorial PAR=10 COUNTER=1 FAC=1 ; result ; loop FAC = FAC * COUNTER COUNTER=COUNTER+1 TMP = PAR - COUNTER TMP ? 5 ; if( PAR != COUNTER) goto loop ; end
TEST 02
; fibonacci
PAR=10
COUNTER=2
FIRST=1
SECOND=1
RESULT=0
; loop
RESULT = FIRST + SECOND;
FIRST = SECOND;
SECOND = RESULT;
COUNTER=COUNTER+1
TMP = PAR - COUNTER
TMP?7 ; if( PAR != COUNTER) goto loop
; end
TEST 03
; indirect
goto = 1
goto ? 20
; case 0
jmp = 2
acc = acc + 3
goto ? 23
; case 1
jmp = 3
acc = acc - 1
goto ? 23
; case 2
jmp = 1
acc = acc * 7
goto ? 23
; case 3
jmp = 0 ; just for fun
acc = acc / 4
goto ? 27
;;;;;;;;;;;;;;;;;;;; main 20
acc = 0;
jmp = 0
;;;;;;;;;;;;;;;;;;;; loop 23
jmp = jmp * 4
jmp = jmp + 3
goto ? jmp
;;;;;;;;;;;;;;;;;;;; end 27
Testy 04-12 obashují kód se syntaktickými chybami