Wyłapanie wszystkich błędów

0

Witam, piszę parser wyrażeń matematycznych w Qt.

Mam pytanie, czy jest możliwość aby wyłapać wszystkie błędy?
Tzn.: Wpisuję 3+/^5 i program nie kończy działania (tak się teraz dzieje) i wyświetla błędu, tylko, np. wyświętla QMessageBox'a z komunikatem o błędzie.

Wyłapanie wszystkich błędów za pomocą try i catch jest bardzo ciężkie przy takim programie. Ktoś ma jakiś pomysł?

0

No ale jak piszesz ten parser? :|
Normalnie wyłapywanie błędów jest właśnie częścią parsera, chyba że korzystasz z jakiejś konwersji na odwrotną notację polską czy coś... ale temu do parsera z rzeczywistego zdarzenia daleko.

1
  1. To nie jest parser ;-)
  2. Za dużo magicznych stałych typu wrzucanie na stos stringu k albo jakieś magiczne przyrównywanie do 0x221A (?)
  3. Napisz tokenizer do tego, inaczej bawienie się w analizę tego kodu to porażka - za dużo tu się dzieje na raz.
0

Wiesz co to jest tokenizer czy zgadujesz?

0

Myślałem, że chodzi o to.

0

Dlaczego po prostu nie sprawdzisz danego terminu w internecie, zamiast bawić się myślałem że to to? Myślałem że to był wyrostek... no... no kurczę, naprawdę nie chciałem panu wyciąć wątroby :P

Tokenizer to taki "program" (część programu/proces), który zamienia ciąg znaków na listę tokenów.
Na przykład z działania 2 + 2 * 2 tokenizer produkuje (przykład):

NUMBER: 2
PLUS
NUMBER: 2
STAR
NUMBER: 2

Mając tę listę tokenów, swoją pracę zaczyna parser i interpretuje on wszystkie tokeny nadając im znaczenie (np. token PLUS to w tym kontekście operator dodawania) oraz budując drzewo składniowe (abstract syntax tree).
Jest masa poradników cd. tworzenia prostych tokenizerów oraz parserów, choć sam temat jest ogromny - poszukaj w internecie wykładów/artykułów.

0

Ale ja nie chcę pisać parsera opartego, np. na drzewie tylko na odwrotnej notacji polskiej. Potrzebuję jedynie pomocy co do tych błędów.

0

To co Ty piszesz to nie jest parser oparty na odwrotnej notacji polskiej tylko konwerter postaci infiksowej do ONP, w tym jest różnica :P
Po prostu mówię, że z parserem byłoby czytelniej, prościej i mniej roboty, bo wykrywanie błędów miałbyś "w pakiecie", ale jak tam wolisz (chyba że masz taki warunek postawiony w zadaniu).

Tak czy siak, w takiej najbardziej prymitywnej wersji odnajdywania błędów musiałbyś mieć jakiś enum/set/cokolwiek zapamiętujące to czego konwerter w danej chwili oczekuje. Na przykład na początku ustawione byłoby to na liczba lub nawias otwierający, po wczytaniu liczby zmieniałbyś to na operator, po wczytaniu operatora znowu liczba lub nawias otwierający i tak dalej - potem tylko kwestia dodania wszędzie warunków sprawdzających czy to co teraz wczytujesz jest oczekiwane.

0

Jeśli przyjrzysz się drugiej funkcji, którą tutaj wstawiłem to zauważysz, że oblicza ona wyrażenie, które jest do niej wysłane w postaci ONP. A więc użytkownik otrzymuje wynik wyrażenia. Konwersja na onp jest jedynie puntem przejściowym.

Chciałbym aby po napotkaniu czegokolwiek czego nie oczekuję program wyświetlił komunikat i przerwał obliczenia.

0

Jeśli przyjrzysz się drugiej funkcji, którą tutaj wstawiłem to zauważysz, że oblicza ona wyrażenie, które jest do niej wysłane w postaci ONP. A więc użytkownik otrzymuje wynik wyrażenia. Konwersja na onp jest jedynie puntem przejściowym.
?
Chyba zgubiłem kontekst - do czego się to odnosi?

Chciałbym aby po napotkaniu czegokolwiek czego nie oczekuję program wyświetlił komunikat i przerwał obliczenia.

No a ja Ci właśnie sposób na to podałem powyżej.

0
Patryk27 napisał(a):

Jeśli przyjrzysz się drugiej funkcji, którą tutaj wstawiłem to zauważysz, że oblicza ona wyrażenie, które jest do niej wysłane w postaci ONP. A więc użytkownik otrzymuje wynik wyrażenia. Konwersja na onp jest jedynie puntem przejściowym.
?
Chyba zgubiłem kontekst - do czego się to odnosi?
Do tego, że według mnie to jest parser :D

Chciałbym aby po napotkaniu czegokolwiek czego nie oczekuję program wyświetlił komunikat i przerwał obliczenia.

No a ja Ci właśnie sposób na to podałem powyżej.

Czyli utworzyć kolejną metodę i w niej zająć się analizą wyrażenia?

1

Do tego, że według mnie to jest parser
Parser dokonuje analizy składniowej - u Ciebie w żadnym momencie nic takiego nie jest dokonywane, po prostu przerzucasz coś na stos i zdejmujesz z niego - dlatego to nie jest parser, a konwerter. Choć zgaduję, że można by się kłócić.

Czyli utworzyć kolejną metodę i w niej zająć się analizą wyrażenia?
Po co kolejna metoda od razu? Możesz sprawdzać wraz z konwersją w metodzie onp::RPN (przy okazji zmień jej nazwę na InfixToRPN czy coś w ten deseń, aby nie trzeba było się zastanawiać, co ta metoda robi).

1 użytkowników online, w tym zalogowanych: 0, gości: 1