![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Chciałem sobie zrobić prosty kalkulator który będzie pobierał od użytkownika wyrażenie arytmetyczne i zwracał jego wynik. Np: Podaję: Kod (10+9)/(11*8) Otrzymuję Kod 0.215909090 Myślałem nad wykorzystaniem do tego wyrażeń regularnych, ale pojawia się pewien problem. Otóż nie bardzo wiem jak wymusić na kwantyfikatorach, aby dzielił mi wyrażenie tylko względem najwyższego znaku tzn. powyższe wyrażenie powinno mi podzielić na: Kod l=(10+9); r=(11*8); sign=/; oczywiście powyższe wyrażenia mogą wyglądać także inaczej. Np można używać na nich prostych funkcji: Kod sin(10+4)/cos(8-11) l=sin(10+4); sign=/; r=cos(8-11); Do tej pory używałem wyrażenia regularnego: Kod /^(?<l>[[:print:]]+)(?<sign>[\*\/\-\+]{1})(?<r>[[:print:]]+)/ Każdą ze stron wyrażenia arytmetycznego będę rozpoznawał rekurencyjnie, i do analizy funkcji mam już wyrażenie regularne Jak można by to najrozsądniej rozwiązać? Ten post edytował shinuexx 27.11.2011, 14:10:33 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 78 Pomógł: 9 Dołączył: 2.02.2011 Skąd: undefined Ostrzeżenie: (0%) ![]() ![]() |
W sumie to nie bardzo już teraz wiem co miałem znaleźć. O LEXER'ach i PARSER'ach??
ok. Dowiedziałem się od znajomego, że można to zrobić za pomocą odwrotnej notacji polskiej. Jak dla mnie jest to naprawdę przyjemny i przejrzysty algorytm liczenia wyrażeń matematycznych uwzględniający pierwszeństwo. Wyrażeń regularnych użyłem do dzielenia ciągu na tokeny.
Nie miałem innego pomysłu na token'owanie a to było dość przyjemne. Jeśli ktoś miałby lepszy pomysł to nie mam nic lepszego. Jeśli ktoś chce mogę zamieścić kody tego co do tej pory udało mi się zrobić tj: -lexer, -parser, -counter, wraz z obsługą podstawowych funkcji oraz podstawiania zmiennych zdefiniowanych przed wyliczeniem. Brak jeszcze obsługi błędów, co zamierzam wprowadzić. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 12.10.2025 - 12:39 |