\documentclass[a4paper]{article}
\setlength{\oddsidemargin}{-1cm} \setlength{\topmargin}{-3cm}
\setlength{\textwidth}{18cm} \setlength{\textheight}{26cm}
\pagestyle{empty}

\def\DJ{\leavevmode\setbox0=\hbox{D}\kern0pt
 \rlap{\kern.04em\raise.188\ht0\hbox{-}}D}
\def\dj{\leavevmode\setbox0=\hbox{d}\kern0pt
 \rlap{\kern.215em\raise.46\ht0\hbox{-}}d}

\begin{document}
\begin{center}
\textbf{Prevodioci i interpretatori - februar 2008.}
\end{center}
\begin{small}
\begin{enumerate}
\item Napisati perl skript koji simulacijom rada kona\v cnog automata u svim datotekama 
koje se nalaze u direktorijumu koji se navodi kao argument komandne linije pronalazi one linije
koje sadr\v ze re\v c iz regularnog jezika $((a|b)*ab?)+ba$.

\item Napisati interpreter za fiktivni jezik MiniLisp. Osnovni izrazi ovog jezika
su atomi (literali, numerali) ili liste koje u sebi kao elemente sadr\v ze druge izraze. 
Prazne liste se ozna\v cavaju sa \verb"()".
Specijalna vrednost \verb"nil" ozna\v cava neta\v cno, dok specijalna vrednost \verb"t" ozna\v cava ta\v cno. 

Svakom izrazu je mogu\' ce pridru\v ziti vrednost. Vrednost atomi\v ckog izraza je sam on. 
Vrednost izraza predstavljenih listama se izra\v cunava tako \v sto se prvi element liste tuma\v ci kao 
oznaka funkcije dok se ostatali elementi liste tuma\v ci kao operandi. 
Tako je npr. vrednost izraza \verb"(+ 2 3)" atom 5. Ukoliko se ispred liste navede \verb"'" to ozna\v cava da nije 
potrebno na pretnodno opisan na\v cin izra\v cunavati vrednost ove liste, ve\' c ona doslovno predstavlja sebe.
 
Jezik podr\v zava kori\v s\' cenje aritmeti\v ckih operatora \verb"*" i \verb"+". 
Operator \verb"car" izdvaja prvi element liste. 
Operator \verb"cdr" izdvaja ostatak liste. 
Operator \verb"cons" postavlja dati element na po\v cetak date liste, 
dok operator \verb"append" nadovezuje dve liste. 
Operator \verb"if" ozna\v cava uslovni operator. 
Operator \verb"null" proverava da li je lista prazna, dok operator \verb"eql" proverava jednakost.

Operator \verb"defun" omogu\' cava definisanje funkcija.


\begin{verbatim}
(* 3 (+ 4 5))                           27
\end{verbatim}

\begin{verbatim}
(car '(1 2 3 4))                        1
\end{verbatim}

\begin{verbatim}
(cdr '(1 2 3 4))                        (2 3 4)
\end{verbatim}

\begin{verbatim}
(car (cdr (cdr '(1 2 3 4))))            3
\end{verbatim}

\begin{verbatim}
(cons 1 '(2 3))                         (1 2 3)
\end{verbatim}

\begin{verbatim}
(cons '(1 2) '(3 4))                    ((1 2) 3 4)
\end{verbatim}

\begin{verbatim}
(append '(1 2) '(3 4))                  (1 2 3 4)
\end{verbatim}

\begin{verbatim}	
(append '(1 2 3) '() '(4) '(5 6))       (1 2 3 4 5 6)
\end{verbatim}

\begin{verbatim}
(null '(1 2 3))                         nil
(null '())                              t
\end{verbatim}

\begin{verbatim}
(eql 1 2)                               nil
(eql 1 1)                               t
\end{verbatim}

\begin{verbatim}
(if (eql 1 2) 3 4)                      4
\end{verbatim}

\begin{verbatim}
(defun member (obj lst)
  (if (null lst)
      nil
      (if (eql (car lst) obj)
          lst
          (member obj (cdr lst)))))
(member 3 (1 2 3 5))                    3 5
(member 3 (1 2 4 5))                    nil
\end{verbatim}

\end{enumerate}
\end{small}
\end{document}

