Search
V tomto úkolu navážete na minulý, a svůj evaluátor matematických výrazů rozšíříte o podporu funkcí a o detekci chyb.
Vstup již může obsahovat víceméně arbitrární znaky a vaším úkolem je ho nejenom vyhodnotit, ale i detekovat chyby. Stále platí, že čísla používají dekadický zápis, operátory jsou stejné jako minule a funkce jsou definovány jako sekvence alfanumerických znaků, začínající písmenem a následována levou závorkou (“(”). Funkce jsou podporovány pouze tři, sin, cos, log.
(
sin
cos
log
Předpokládejte, že argumenty pro sin a cos jsou v radiánech.
Hlášení chyb probíhá pomocí výjimek. V expr.hpp je předdefinovaná rodina výjimek, domain_exception, unknown_function_exception, invalid_expression_exception a jejich společný předek, math_exception.
expr.hpp
domain_exception
unknown_function_exception
invalid_expression_exception
math_exception
Jak název napovídá, unknown_function_exception slouží k hlášení výrazů ve kterých se vyskytuje neznámá funkce a domain_exception slouží k hlášení špatného vstupu do funkcí, které mají omezený definiční obor (v našem případě log). invalid_expression_exception pak slouží k hlášení všech ostatních chyb.
Potřebné hlavičkové soubory a testy jsou ke stažení zde.
f1
Všechny soubory, které implementují vaší část úlohy, specificky pokud jste přidali další .hpp soubory, pak je nezapomeňte též odevzdat. Naopak ale neodevzdávejte expr.hpp, ani žádné testovací soubory.
Stále platí, že operátor pro výpis do proudu (<<) netestujeme.
<<
Ke kontrole výrazů vám poradíme pár jednoduchých pravidel
Doporučujeme stejné hlavičky ze standardní knihovny jako v minulém úkolu.