% % Este ficheiro contem um texto em Literate Haskell % Partes do ficheiro são texto em LaTeX e outras em Haskell % % Métodos de Programação III % 2000/2001 % \documentclass[12pt]{article} \usepackage{a4wide} \usepackage{graphics} \usepackage{graphicx} \usepackage{color} \usepackage{alltt} \usepackage{portuges} \usepackage[latin1]{inputenc} \usepackage{latexsym} \usepackage[dvips]{epsfig} \usepackage{epic} \usepackage{eepic} \def\Ipe#1{\def\IPEfile{#1}\input{#1}} \newenvironment{code} {\textbf{Solução} \hspace{1cm} \hrulefill \\ \smallskip \begin{center} \begin{minipage}{.80\textwidth} \begin{alltt}\small} {\end{alltt} \end{minipage} \end{center} \hrule\smallskip } \newtheorem{exercicio}{}[section] \title{\sf Métodos de programação III \\ \begin{tabular}{c} {\small LMCC \& LESI}, {\small Universidade do Minho} \\ {\small Ano lectivo 2000/2001} \\ {\small Ficha Teórico-Prática N$º$10} \\ \end{tabular} } \author{} \date{} %-------------------- Inicio do Documento ------------------------------- \begin{document} \maketitle Este texto está escrito em \textbf{literate Haskell}. Isto é, pode ser interpretado como um documento \LaTeX\ ou como um puro programa na linguagem Haskell. Responda às perguntas sobre Haskell neste próprio ficheiro e assim produzir o programa e a sua documentação. \section{Gramáticas Independentes de Contexto em Haskell} \begin{exercicio} Defina combinadores de parsing para as seguintes linguagens: \begin{enumerate} \item A linguagem usual para definir strings nas linguagens de programação. Uma string é uma sequência de caracteres iniciada e terminada pelo caracter \texttt{"}. \item Usualmente os espaços são consumidos e ignorados durante o parsing de um texto. Re-escreva o combinador \texttt{token} de modo a consumir os espaços que possam ocorrer antes do token. Utilize para tal, a função de parsing feita na aula anterior que define a ocorrência de zero ou mais espaçõs: \texttt{zeroOuMaisEspacos}. \end{enumerate} \end{exercicio} \begin{code} import Parser string :: Parser Char [Char] parser_string inp = case string inp of [] -> "" (x:xs) -> case x of (res,[]) -> res _ -> "" main = do s <- readFile "input" putStr (parser_string s) -- token' :: [Char] -> Parser Char [Char] \end{code} \begin{exercicio} Considere de novo a linguagem HTML e a sua notação para descrever tabelas. A gramática independente do contexto para definir a estrutura concreta desta linguagem foi definida na ficha-teórica nº8. A gramática abstracta e o tipo de dados isomórfico foi definido na ficha-teórica nº9. Re-escreva a gramática concreta da linguagem com combinadores de Parsing. O resultado do parser é a árvore construída usando os construtores do tipo de dados induzidos pela gramática abstracta. De seguida apresenta-se a gramática concreta para a linguagem das tabelas HTML: \medskip \small \begin{minipage}[t]{.90\textwidth} \begin{tabular}[t]{l} G=(T,N,S,P), \textit{com} \\ T = \{\verb@""@,\verb@"
"@,\verb@""@,\verb@""@,\verb@""@,\verb@""@,texto \} \\ N = \{ Tabela , Linhas , Linha , Colunas , Coluna , Elemento \} \\ S = Tabela \\ \end{tabular} \\ \end{minipage} \\ \begin{minipage}[t]{.90\textwidth} \begin{tabular}[t]{lclccl} P = & \{ & Tabela: & Tabela & $\rightarrow$ & \verb@""@ Linhas \verb@"
"@\\ & , & NoLinhas: & Linhas & $\rightarrow$ & \\ & , & CLinhas: & & $|$ & Linha Linhas \\ & , & Linha: & Linha & $\rightarrow$ & \verb@""@ Colunas \verb@""@ \\ & , & NoCols: & Colunas & $\rightarrow$ & \\ & , & CCols: & & $|$ & Coluna Colunas \\ & , & Coluna: & Coluna & $\rightarrow$ & \verb@""@ Elemento \verb@""@ \\ & , & Texto: & Elemento & $\rightarrow$ & texto \\ & , & TabAnin: & & $|$ & Tabela \\ & \} \\ \end{tabular} \end{minipage} \normalsize \medskip E o tipo de dados calculado a partir da gramática abstracta está já escrito na solução do exercício. \end{exercicio} \begin{code} data Tabela = Tabela Linhas deriving Show data Linhas = NoLinhas | CLinhas Linha Linhas deriving Show data Linha = Linha Colunas deriving Show data Colunas = NoCols | CCols Coluna Colunas deriving Show data Coluna = Coluna Elemento deriving Show data Elemento = Texto String | TabAnin Tabela deriving Show -- tabela :: Parser Char Tabela \end{code} A função que lê uma tabela HTML de um ficheiro (com nome \texttt{inputTabela}) e escreve o resultado na saída apresenta-se a seguir. \begin{code} runparser_table :: [Char] -> Maybe Tabela runparser_table inp = case tabela inp of [] -> Nothing (x:xs) -> case x of (ast,[]) -> (Just ast) _ -> Nothing showResTable :: Maybe Tabela -> String showResTable (Nothing ) = "" showResTable (Just tabela) = show tabela mainTabela :: IO () mainTabela = do s <- readFile "inputTabela" putStr (showResTable (runparser_table s)) \end{code} \begin{exercicio} Considere a gramática independente do contexto que define uma representação concreta de expressões aritméticas. \small \begin{minipage}[t]{.40\textwidth} \( \begin{array}[t]{l} G=(T,N,S,P), \textit{com} \\ T = \{+,-,*,/,(,),num,var \} \\ N = \{ Expr \} \\ S = Expr \\ \end{array} \) \end{minipage} \begin{minipage}[t]{.45\textwidth} \( \begin{array}[t]{lclccl} P = & \{ & Soma: & Expr & \rightarrow & Expr\ '+'\ Expr \\ & , & Mul: & & | & Expr\ '*'\ Expr \\ & , & Div: & & | & Expr\ '/'\ Expr \\ & , & Sub: & & | & Expr\ '-'\ Expr \\ & , & Prio: & & | & '('\ Expr\ ')' \\ & , & Num: & & | & num \\ & , & Var: & & | & var \\ & \} \\ \end{array} \) \end{minipage} \normalsize Será possível implementar directamente esta gramática usando combinadores de parsing? Porquê? Defina uma gramática concreta equivalente, para a qual podemos construir combinadores de parsing. Determine a gramática asbtracta, escreva os tipos de dados abstractos do Haskell e defina o catamorfismo sobre esse tipo de dados. Implemente os combinadores de parsing de modo a construirem a estrutura de dados que representa a expressão aritmética processada. \end{exercicio} \begin{code} \end{code} \begin{exercicio} Construa a seguintes funções: \begin{enumerate} \item Defina uma função showLateX para o tipo de dados \texttt{Tabela} de modo a "mostrar" as tabelas asbtractas na notação (concreta) do \LaTeX. Use a função show para mostrar o resultado do parser e assim obter um conversor de tabelas HTML para tabelas em \LaTeX. \item Considere os parsers construídos nos dois exercícios anteriores. Generalise esse parsers de modo a ser possível instanciar esses parsers com diferentes semânticas. Isto é, parameterize esses parsers com as funções que são aplicadas durante o reconhecimento sintático. \end{enumerate} \end{exercicio} \end{document}