Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][regexp]Dzielenie wyrażeń arytmetycznych za pomocą wyrażeń regularnych
shinuexx
post
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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
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.
Generalnie użycie wyr. reg. nawet do wydzielenia tokenów jest błędne - bo one wyłapią jedynie pewne wzorce, a nie zwrócą rezultatu pełnej analizy ciągu (jeżeli coś nie będzie pasować to to ominą zamiast rozpoznać jako niewłaściwy token).
Nie mniej jednak jeżeli spełnia to swoje zadanie w zadowalającym stopniu możesz to tak zostawić.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 19:29