# Zápočet 3.2.

<{ForumPost(poster="Oracions", timestamp=2014-02-03 13:13:27)}>
Naprogramujte pretty-printer JSONu. Ve vstupním souboru jsou bílými znaky oddělené tokeny. Soubor je jeden prvek, kde prvek může být buď string, což je řetezec ohraničený uvozovkami, pro jednoduchost bez mezer uvnitř, nebo integer, nebo pole (začíná a končí hranatými závorkami, uvnitř čárkami oddělené prvky), nebo objekt (začíná a končí složenými závorkami, uvnitř čárkami oddělené dvojice klíč:hodnota).  
  
Například pro vstup:

    { "key1" : 21 , "key2" : [ "prvnipolozkapole" , "zadneMezery" ] }
    

bylo třeba na výstup vypsat:

    {
       "key1" : 21 ,
       "key2" : [
            "prvnipolozkapole" ,
            "zadneMezery"
        ]
    }
    

Zadání bylo vysvětleno do podrobností, dostali jsme několik testovacích souborů, na kterých také byla zkoušena funkčnost. Bylo třeba ošetřit i neplatné vstupy.
<{/ForumPost}>

<{ForumPost(poster="Pet", timestamp=2014-02-03 22:03:27)}>
Ahoj,  
29.1. byly rámečky  
  
Ramecky  
  
Vasim ukolem je naprogramovat interpreter jazyka, ktery slouzi k zobrazovani "ramecku" kolem retezcu.  
  
Jazyk  
  
    Kazdy prikaz je na samostatnem radku.  
    V programu se mohou vyskytnout nasledujici prikazy:  
  
  
// radek zacinajici dvema slashi je komentar, prazdne radky se ignoruji  
//  
// JAZYKOVE KONSTRUKTY  
//////////////////////  
// deklarace promenne  
HBOX {identifikator}  
VBOX {identifikator}  
LABEL {identifikator} {string (do konce radku)}  
  
// vlozeni prvku do "kontejneru"  
ADD {identifikatorKontejneru} {identifikatorVkladanehoPrvku}  
  
// vykresleni prvku na obrazovku  
PRINT {identifikator}  
  
Priklad programu 1:  

    LABEL paulus Roman Paulus
    LABEL ihnacak Peter Ihnacak
    LABEL babica Jiri Babica
    
    VBOX vert
    ADD vert babica
    
    HBOX hor
    ADD hor paulus
    ADD hor ihnacak
    ADD vert hor
    
    ADD vert babica
    
    PRINT vert
    

Vystup programu 1:  

    +----------------------------+
    |Jiri Babica                 |
    +----------------------------+
    |+------------+-------------+|
    ||Roman Paulus|Peter Ihnacak||
    |+------------+-------------+|
    +----------------------------+
    |Jiri Babica                 |
    +----------------------------+
    

Priklad programu 1:  

    LABEL paulus Roman Paulus
    LABEL ihnacak Peter Ihnacak
    LABEL babica Jiri Babica
    
    VBOX vert
    ADD vert babica
    
    HBOX hor
    ADD vert hor
    
    ADD vert babica
    
    PRINT vert
    

Vystup programu 1:  

    +-----------+
    |Jiri Babica|
    +-----------+
    +-----------+
    |Jiri Babica|
    +-----------+
    

Okrajove podminky  
  
    spatny pocet argumentu, problem s otevrenim vstupniho souboru - "Argument error"  
    nedeklarovana promenna - "Line 21: Variable 'A' not declared"  
    redeklarace promenne - "Line 21: Variable 'A' redeclared"  
    cyklus (vypsat az pri PRINTu, radka 21 obsahuje PRINT) - "Line 21: Cycle detected"  
    prirazeni do labelu, neznama operace nebo spatny pocet argumentu operace - "Line 21: Operation error"  
    nevyskytuji se zadne "multi-line" labely, tj. cely retezec je na jednom radku  
    pokud je prvek prazdny - tj. label nulove delky nebo kontejner s nulovym poctem prvku, tak se na vystup nevypisuje (viz priklad 2)  
  
Poznamky  
  
    vstupni soubor se vejde do pameti  
    "platno", na ktere budete kreslit, se vejde do pameti  
    pozor, jedna promenna (napr. label) muze byt pouzita v programu nekolikrat - napr. vlozena do stejneho kontejneru vicekrat.  
    rozmery HBOXu a VBOXu jsou vzdy co nejmensi, ale tak, aby to stale byl obdelnik  
    polozka v HBOXu i VBOXu je vzdy zarovnana doleva a nahoru.  
    identifikator je retezec bez bilych znaku
<{/ForumPost}>

