\documentclass{article}

%% Escrevendo em português:
\usepackage[brazil]{babel}
\usepackage[latin1]{inputenc}
%----------------------------

\setlength{\textheight}{8in}
\setlength{\oddsidemargin}{-.125in}
\setlength{\evensidemargin}{-.125in}
\setlength{\textwidth}{6.75in}


\newenvironment{exemplo}{\begin{quote}\tt}{\end{quote}}
\pagestyle{empty}

\begin{document}
\begin{center}\Large
  \textbf{Segunda Prova de MAC-211}\\
  \textbf{Primeiro semestre de 2001}\\
  Profs. Gubi e Fabio
\end{center}

\vspace{1cm}

\begin{enumerate}
%expressões regulares
\item (2.0 pontos) Escreva expressões regulares para cada uma das
    seguintes condições:
    \begin{enumerate}
    \item Reconheça cadeias que possuam letras maiúsculas e minúsculas
    alternadas.
    \item Reconheça exatamente 1024 cadeias diferentes. Faça isso de duas
      formas diferentes (usando operadores diferentes).
    \item Reconheça todos os números inteiros positivos menores que 3000.
    \item Reconheça todos os números hexadecimais que podem ser representados
      com um byte.
    \end{enumerate}

\vspace{.75cm}

%programação / depuração
\item (2.0 pontos) O que devemos fazer para depurar um programa que
    apresenta um determinado erro (\emph{bug}) só de vez em quando,
    indeterministicamente? Dê um exemplo.

\vspace{.75cm}

%awk
\item (2.0 pontos) Para cada uma das chamadas do \texttt{awk} abaixo, explique
  o que ela faz.
  \begin{enumerate}
  \item \texttt{awk 'length(\$0) > 80'}
  \item \texttt{awk '\{ if (NF > 0) print \}'}
  \item \texttt{awk '\{ printf ``\%d: \%s'', NR, \$0 \}'}
  \item \texttt{awk '/banana/ \{ print \$2 \$1 \}'}
  \end{enumerate}

\vspace{.75cm}

%calculadora
\item (2.0 Pontos) Como implementar na calculadora recursiva o
  operador \^~ (potência)?
  
\vspace{.75cm}

%flex  
\item (2.0 pontos) Escreva uma especificação em {\tt flex}
  para um filtro que copia um texto da entrada para a saída, trocando
  \begin{enumerate}
    \item todas as seqüências consecutivas de espaços e TABs por um único
          espaço,   
    \item todos os espaços em branco nos finais das linhas por nada
          (remoção) e
    \item todas as ocorrências da palavra \texttt{usuário} pelo nome do
      usuário devolvido pela função \texttt{char *getlogin()}. Para
      usar essa função é preciso incluir o arquivo de cabeçalho
      \texttt{unistd.h}.
      \end{enumerate}

\end{enumerate}

\vspace{1.5cm}

\begin{center}
\textbf{Boa(sorte$|$prova)}
\end{center}

\newpage

{\small
\begin{verbatim}
Expressões Regulares
--------------------
`x' match the character `x' 
`.' any character (byte) except newline 
`[xyz]' a "character class"; matches  `x' a `y', or a `z' 
`[a-z]' a "character class" with a range in it; matches any lowercase letter.
`[^A-Z]' a "negated character class": any character but those in the class. 
`r*' zero or more r's, where r is any regular expression 
`r+' one or more r's 
`r?' zero or one r's (that is, "an optional r") 
`r{m}'   exactly m r's 
`r{m,n}' anywhere from m to n r's 
`r{m,}'  m or more r's 
`(r)' match an r; parentheses are used to override precedence
`rs' the regular expression r followed by the regular expression s;
`r|s' either an r or an s 
`^r' an r, but only at the beginning of a line
`r$' an r, but only at the end of a line

AWK
---
Um programa é uma seqüência de linhas do tipo:

 /PADRÃO/ { AÇÃO }              ou
 CONDIÇÃO { AÇÃO }

NF = número de campos no registro (linha) atual
se i > 0, $i corresponde ao i-ésimo campo 
          $0 corresponde ao registro (linha) inteiro

FLEX
----
Uma especificação é da forma:

inicializações
%%
regras
%%
código C principal

regras são da forma

PADRÃO {
         AÇÃO
       }

char *yytext contém o texto recém reconhecido pelo PADRÃO.

A ação ECHO copia yytext para a saída.
\end{verbatim}
}
\end{document}




