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