Zadání úlohy č. 5

Syntaktická analýza rekurzivním sestupem

Implementujte syntaktický analyzátor jazyka aritmetických výrazů s celými čísly, operátory +, -, *, / (s obvyklými prioritami a levou asociativitou) a závorkami. Pro implementaci využijte následující gramatiku:

   E  :  T E1;        (1)
   E1 :  '+' T E1     (2)
      |  '-' T E1     (3)
      |  {e};         (4)
   T  :  F T1;        (5)
   T1 :  '*' F T1     (6)
      |  '/' F T1     (7)
      |  {e}          (8)
   F  :  '(' E ')'    (9)
      |  num          (10)
kde num představuje celé číslo bez znaménka.

Specifikace vstupu:

Vstupní data se čtou ze standardního vstupu. Na prvním řádku je uveden počet zadání, každé zadání je tvořeno jedním řádkem obsahujícím výraz. Mezi jednotlivými lexikálními jednotkami tvořícími výraz mohou být mezery.

Specifikace výstupu:

Program vypíše na standardní výstup pro každé zadání odpovídající gramatice posloupnost čísel použitých pravidel oddělených mezerou. Je-li detekována syntaktická chyba, vypíše se pouze řetězec CHYBA.

Příklad:

Následující příklad obsahuje dvě zadání, první je syntakticky správný řetězec 2 * (3+5), druhé zadání obsahuje syntaktickou chybu.

Vstup:

   2
   2 * (3+5)
   15 - 2**7

Výstup:

   1 5 10 6 9 1 5 10 8 2 5 10 8 4 8 4
   CHYBA