% Specifikace třídy dokumentu a základní velikosti písma.
\documentclass[12pt, a4paper]{article}

% Podpora češtiny
\usepackage[utf8]{inputenc}
\usepackage[IL2]{fontenc}
\usepackage[czech]{babel}

\usepackage{amsfonts}

% Okraje stránky
\usepackage[
    left=30mm, 
    right=30mm, 
    top=40mm, 
    bottom=30mm,
%    twoside, % Při oboustranné sazbě si zkuste nastavit right=25mm a left=35mm.
    % showframe % Vykreslí okraje stránky.
]{geometry}

% Americký styl odstavců (mně se tento styl líbí o poznání více)
\usepackage{parskip}

% Sazba obrázků
\usepackage{graphicx}
\graphicspath{{Images/}} % Při vkládání obrázků se bude prefixovat tato relativní cesta.

% \usepackage{inconsolata}

% Při použití tohoto balíku začnou fungovat odkazy v textu.
% Zkuste třeba kliknout na odkazy v textu (např. "1.1" na straně 2) nebo v seznamu obrázků/tabulek.
% `hidelinks` skryje ošklivé výchozí rámečky kolem odkazů.
\usepackage[hidelinks]{hyperref}

% Začátek dokumentu
\begin{document}

% Titulní strana (prostředí minimálně odstraní číslo strany)
\begin{titlepage}
    \centering      % Odtud do konce prostředí bude vše na středu,
    \Large          % velkými písmeny
    \sffamily       % a bezpatkovým písmem.

    %Vložení obrázku (ze složky `Images`)
    \includegraphics[width=.7\textwidth]{fav}

    Semestrální práce z předmětu

    % Prázdná mezera mezi řádky znamená nový odstavec.
    Programování v jazyce C
    
    % Vertikální mezera 18 mm.
    \vspace{18mm}
    {\Huge\bfseries Vizualizace grafu matematické funkce}\\

    \vspace{18mm}
    \today                          % Čas je získán ze systému.


    \vfill                          % Vyplní prostor
    \raggedright                    % Vše bude zarováno do leva.
    \textsl{Autor:}\\               % Vtípek z přednášky + ukázka tvorby makra a přidání sémantiky do stylu textu.
    Zbyněk Vajchart\\               % Příkaz \\ provede násilný zlom řádky.
    A23B0144P\\
    \texttt{zbyv@students.zcu.cz}
\end{titlepage}

\tableofcontents
\newpage

% Ukázka odstranění čísla stránky -- první stránka obsahu ale má být číslovaná!
%\thispagestyle{empty}

% Sazba nové kapitoly (ve vašem případě zde bude zřejmě zkrácená verze "Zadání")
\section{Zadání}
Naprogramujte v jazyce ANSI C přenositelnou konzolovou aplikaci, která jako vstup načte
z~parametru na příkazové řádce matematickou funkci ve tvaru $y = f(x); x, y \in \mathbb{R}$,
provede její analýzu a~vytvoří soubor ve formátu PostScript s~grafem této funkce na
zvoleném definičním oboru.

Celé zadání je k~dispozici na \url{https://www.kiv.zcu.cz/studies/predmety/pc/data/works/sw2024-02.pdf}.

\section{Analýza úlohy}
Úloha se skládá ze dvou hlavních problémů: matematickou funkci je nejprve třeba analyzovat a~poté 
použít výstup této analýzy ke zjištění jejích hodnot v~jednotlivých bodech a~vykreslení grafu.

\subsection{Analýza funkce}
Analýzu zadané matematické funkce je vhodné rozdělit do dvou částí --- analýzu lexikální a~syntaktickou.
Výhoda tohoto rozdělení je popsána níže.

\subsubsection{Lexikální analýza}
Během lexikální analýzy je funkce rozdělena na jednotlivé, dále nedělitelné \textit{tokeny} (např. konstanty, operátory, proměnné).
Některé typy tokenů pak mají hodnotu, typicky třeba konstanty --- jejich hodnotou je číslo, které reprezentují.
Výhodou lexikální analýzy je, že zjednodušuje další zpracování funkce, protože z~pohledu syntaxe je jedno, zda
se v~zápisu funkce vyskytne např.~\texttt{2}, \texttt{1e10} nebo \texttt{pi} --- všechny tyto sekvence znaků
se při lexikální analýze převedou na token \textit{konstanta} s~odpovídající hodnotou. To samozřejmě platí i~pro
jiné typy tokenů. Během lexikální analýzy jsou také odstraněny bílé znaky, které nemají v~zápisu funkce žádný význam.
Typy tokenů využité v~této práci jsou uvedeny v~tabulce~\ref{tab:tokens}.

\begin{table}[]
    \centering
    \begin{tabular}{|l|l|}
    \hline
    označení            & popis                         \\ \hline
    \texttt{NUMBER}     & konstanta                     \\ \hline
    \texttt{PLUS}       & operátor sčítání \texttt{+}                           \\ \hline
    \texttt{MINUS}      & operátor odečítání nebo negace \texttt{-}           \\ \hline
    \texttt{MULTIPLY}   & operátor násobení \texttt{*}           \\ \hline
    \texttt{DIVIDE}     & operátor dělení \texttt{*}           \\ \hline
    \texttt{POWER}      & operátor umocnění \verb|^|           \\ \hline
    \texttt{VARIABLE}   & proměnná \texttt{x}           \\ \hline
    \texttt{FUNCTION}   & název funkce           \\ \hline
    \texttt{LEFT\_PAREN}   & levá závorka \verb|(|           \\ \hline
    \texttt{RIGHT\_PAREN}   & pravá závorka \verb|)|           \\ \hline
    \texttt{COMMA}   & oddělovač argumentů \texttt{,}           \\ \hline
    \texttt{EOF}  & konec vstupu           \\ \hline
    \texttt{ERROR} & chyba (nerozpoznatelná sekvence)          \\ \hline
    \end{tabular}
    \caption{Použité typy tokenů}
    \label{tab:tokens}
\end{table}

\subsubsection{Syntaktická analýza}
Následuje analýza syntaktická, během které je zadaná funkce zpracována do stromové struktury, kterou je pak možné
využít pro vyhodnocování funkce v~jednotlivých bodech.
Existuje mnoho způsobů, jak tuto analýzu provést, mezi základní patří např.~rekurzivní sestup nebo algoritmus shunting-yard.
V~této práci je použita metoda rekurzivního sestupu, která je relativně jednoduchá a~přehledná --- program je možné
mechanicky vytvořit z~gramatiky zpracovávaného jazyka. Mezi její další výhody patří, že se oproti
algoritmu shunting-yard dokáže lépe vypořádat s~unárními operátory.

Analyzátor rekurzivním sestupem lze obecně vytvořit z~gramatiky popisující zpracovávaný jazyk
pomocí sady funkcí, které odpovídají jednotlivým pravidlům gramatiky. To je v~tomto případě
snadné, protože pro zpracování matematického výrazu lze sestavit gramatiku

\begin{verbatim}
<expression> = <term> { ( PLUS | MINUS ) <term> }
<term> = <unary> { ( MULTIPLY | DIVIDE ) <unary> }
<unary> = [ PLUS | MINUS ] <power>
<power> = <factor> [ POWER <unary> ]
<factor> = NUMBER | VARIABLE | <function> | <bracketed>
<bracketed> = LEFT_PAREN <expression> RIGHT_PAREN
<function> = FUNCTION
             LEFT_PAREN
             <expression> { [ COMMA ] <expression> }
             RIGHT_PAREN
\end{verbatim}

kde \verb|{}| značí iteraci, \verb|[]| volitelnost a~\texttt{|} jednu z~možností.
Výrazy v~\verb|<>| jsou neterminály, zatímco ostatní symboly jsou terminály odpovídající 
tokenům z~lexikální analýzy.

\end{document}
