Zadání úlohy č. 6

Syntaktická analýza rekurzivním sestupem II

[Řešení v Javě] [Řešení v C#]

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í výsledek vyhodnocení přečeného výrazu. 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:

   16
   CHYBA