• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prosty parser wyrażeń arytmetycznych

VPS Starter Arubacloud
0 głosów
1,204 wizyt
pytanie zadane 31 października 2015 w C i C++ przez Dywan Nowicjusz (170 p.)
Mam problem z napisaniem prostego parsera. W zasadzie nie wiem jak się za niego zabrać. Chcę uzyskać coś takiego.

string a, b, wyrazenie;

char op;

i podaje cos takiego do cin >> wyrazenie; 2+3
Chciałbym pod a mieć 2 ( a = "2"; b = "3"; op = '+'. Funkcje do liczenia już mam napisane. Pomoże ktoś?

4 odpowiedzi

0 głosów
odpowiedź 31 października 2015 przez notabigthreat Mądrala (7,060 p.)
edycja 31 października 2015 przez notabigthreat
 
Najlepsza

Jeśli na pewno wejście jest poprawne:

size_t pozycja_op = wyrazenie.find_first_not_of("1234567890");
op = wyrazenie[pozycja_op];
a = wyrazenie.substr(0, pozycja_op);
b = wyrazenie.substr(pozycja_op+1);

Pamiętaj, że w ten sposób spacje nie zostaną usunięte ("5 +3" zostanie zamienione na: "5 ",'+',"3").

 

komentarz 31 października 2015 przez Dywan Nowicjusz (170 p.)
Bardzo dziękuję. O takie coś właśnie mi chodziło :)
0 głosów
odpowiedź 31 października 2015 przez krzemionskyy Użytkownik (630 p.)
Co w Twoim kodzie oznacza zmienna "wyrazenie"? Możesz rzutować zmienne a i b ze stringa na inta funkcją atoi() z biblioteki <cstdilb> i wtedy wykonać dodawanie tylko jaki w tym cel? Albo czegoś nie rozumiem, albo musisz uściślić swoje pytanie ; )

Pozdrawiam.
0 głosów
odpowiedź 31 października 2015 przez furas Maniak (53,800 p.)
Niektórzy do takich rzeczy używają narzędzi typu Lex i Yacc. Jedno pozwala zdefiniować poprawne "słowa" (np. liczby, znaki działania, itp.) a drugi pozwala zdefiniować poprawne połączenia "słów" np. 2+3 a nie 2++3, oraz przypisać do tego własne funkcje, które będą rozpoznane liczby odpowiednio dodawać, odejmowac,itd. Potem z tego jest generowany kod w C i po skompilowaniu otrzymuje się gotowy program do liczenia wyrażen arytmetycznych.

https://pl.wikipedia.org/wiki/Lex_(informatyka)
https://pl.wikipedia.org/wiki/Yacc

Przykład kodu Lex i Yacc, który ma wygenerować program do obliczania wyrażeń o dowolnej ilości operacji np. 5*8+3.

http://www.studytable.in/2013/03/yacc-program-to-evaluate-arithmetic.html#axzz3q6h8P9yR
0 głosów
odpowiedź 31 października 2015 przez hit02 Nałogowiec (33,970 p.)

Nie wiem, czy dokładnie o to ci chodzi, ale może przyda ci się Odwrotna Notacja Polska. Aby napisać parser matematyczny, najpierw zamieniasz ciąg w notacji infiksowej (zwykłej) na RPN (Reverse Polish Notantion), a potem wyliczasz wartość z RPN.

https://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

 

Podobne pytania

0 głosów
1 odpowiedź 634 wizyt
pytanie zadane 30 października 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
2 odpowiedzi 304 wizyt
pytanie zadane 15 marca 2020 w PHP przez szaman219 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 17 lipca 2019 w Python przez Jakub 0 Pasjonat (23,120 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...