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.
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.
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.
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