using System; class Parser { static string S; static int I; static void Main() { Console.WriteLine("Unesi celobrojni izraz"); S = Console.ReadLine(); I = 0; PreskociPraznine(); int rez = Izraz(); if(I < S.Length) { GRESKA("Neocekivani simbol"); } Console.WriteLine(rez); } static void GRESKA(string poruka) { Console.WriteLine("Greska na poziciji {0}: {1}", I + 1, poruka); System.Environment.Exit(0); } static void PreskociPraznine() { while(I < S.Length && S[I] == ' ') { I++; } } static int Izraz() { if(I == S.Length) { GRESKA("Neocekivani kraj izraza"); } bool znak = false; if(S[I] == '+' || S[I] == '-') { znak = S[I] == '-'; I++; PreskociPraznine(); } int n = Sabirak(); if(znak) { n = -n; } while(I < S.Length && OpSabiranja()) { char op = S[I]; I++; PreskociPraznine(); int k = Sabirak(); if(op == '+') { n += k; } else { n -= k; } } PreskociPraznine(); return n; } static int Sabirak() { int n = Cinilac(); while(I < S.Length && OpMnozenja()) { char op = S[I]; I++; PreskociPraznine(); int k = Cinilac(); switch(op) { case '*': n *= k; break; case '/': if(k == 0) { GRESKA("Deljenje nulom"); } n /= k; break; case '%': if(k == 0) { GRESKA("Deljenje nulom"); } n %= k; break; } } return n; } static int Cinilac() { if(I == S.Length) { GRESKA("Neocekivani kraj izraza"); } if(Cifra()) { return Broj(); } if(S[I] == '(') { I++; PreskociPraznine(); int n = Izraz(); if(I < S.Length && S[I] == ')') { I++; PreskociPraznine(); } else { GRESKA("Ocekujem )"); } return n; } GRESKA("Neocekivani simbol"); return 0; } static int Broj() { int n = 0; while(I < S.Length && Cifra()) { n = 10 * n + ((int)S[I] - (int)'0'); I++; } PreskociPraznine(); return n; } static bool Cifra() { return '0' <= S[I] && S[I] <= '9'; } static bool OpSabiranja() { return S[I] == '+' || S[I] == '-'; } static bool OpMnozenja() { return S[I] == '*' || S[I] == '/' || S[I] == '%'; } }